这个题目是寒假在家看的,当时没有想到怎么做,后来看了别人的题解。说说是如果每个城市到达的次数大于3次,所走的方案中必然出现回路。所以只需要用一个vis[]数组记录每个城市走的次数即可。至于为什么是这样,我也没有想明白。这里先粘上自己的代码吧。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int MAX = 15;
const int INF = 10000000;
struct Edge{
int from, to, c, p, r;
};
vector<Edge>edges;
vector<int>G[MAX];
void addEdge(int from, int to, int c, int p, int r){
edges.push_back((Edge){from, to, c, p, r});
int k = edges.size();
G[from].push_back(k-1);
}
int vis[MAX], ans;
void dfs(int s, int t, int cost){
// printf("%d %d %d\n",s,t,cost);
if (s == t){
ans = min(ans, cost);
return;
}
for (int i = 0; i<G[s].size(); i++){
Edge e = edges[G[s][i]];
if (vis[e.to] <= 3){
if (vis[e.c]){
vis[e.to]++;
dfs(e.to, t, cost+e.p);
}
else{
vis[e.to]++;
dfs(e.to, t, cost+e.r);
}
vis[e.to]--;
}
}
}
int main(){
int n,m;
while (scanf("%d%d",&n,&m) != EOF){
edges.clear();
for (int i = 0; i<MAX; i++) G[i].clear();
int from , to, c, p, r;
for (int i=0; i<m; i++){
scanf("%d%d%d%d%d",&from, &to, &c, &p, &r);
addEdge(from, to, c, p, r);
}
memset(vis, 0, sizeof(vis));
ans = INF;
vis[1]++;
dfs(1, n, 0);
if (ans >= INF){
printf("impossible\n");
}
else{
printf("%d\n",ans);
}
}
return 0;
}