题目链接:http://poj.org/problem?id=3411
题目大意:
从第1个城市到第N个城市中的路需要花钱,如果从ai到bi,没有经过ci,花费为pi, 否则为ri ,要求计算出一条花费最小的路得花费,没有输出impossible
思路:
还是想到dfs,但是这里有个地方要注意,就是有些城市可以经过多次,因此我们之前用于标记的vis数组,不能记录到过没到过,而要改成记录到过的次数,由于题中给出城市的数目<10,因此如果一个城市经过的次数超过4次,就形成环路,无法计算出最小花费,那么我们就需要在DFS中加上判断一个城市被经历的次数
代码:
#include<iostream>
using namespace std;
struct Road
{
int from;
int to;
int privous;
int ncost;
int pcost;
}road[20];
int flag[20];
int n, m;
int mint;
void dfs(int pos, int cost)
{
if(pos == n)
{
if(cost < mint)
{
mint = cost;
}
return;
}
for(int i = 1; i <= m; i++)
{
if(pos == road[i].from && flag[road[i].to] <= 4)
{
flag[road[i].to]++;
if(flag[road[i].privous])
dfs(road[i].to, cost + road[i].pcost);
else
dfs(road[i].to, cost + road[i].ncost);
flag[road[i].to]--;
}
}
}
int main()
{
cin>>n>>m;
for(int i = 1; i <= m; i++)
{
cin>>road[i].from>>road[i].to>>road[i].privous>>road[i].pcost>>road[i].ncost;
}
flag[1] = 1;
int cost = 0;
mint = 1000000;
dfs(1, cost);
if(mint == 1000000)
cout<<"impossible"<<endl;
else
cout<<mint<<endl;
return 0;
}