链接:点击打开链接
题意:有n座城市,m条路,从a城市到b城市,如果之前到过c城市,那么只要付P的钱,如果没有去过就付R的钱。问从城市1到城市n最少要花多少钱
代码:
#include <vector>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
struct node{
int b,c,p,r;
};
vector<node> s[20];
int n,m,ans;
int vis[20];
void dfs(int u,int sum){
// cout<<u<<" "<<sum<<endl;
int i;
vis[u]++; //标记经过的路径
// cout<<vis[1]<<endl;
if(sum>ans)
return;
if(u==n){
ans=min(ans,sum);
return;
}
for(i=0;i<s[u].size();i++){
if(vis[s[u][i].b]<10){ //我认为应该小于10,而不是网上所说的3
if(vis[s[u][i].c]&&s[u][i].p<s[u][i].r) //可以试下下面的数据
dfs(s[u][i].b,sum+s[u][i].p);
else
dfs(s[u][i].b,sum+s[u][i].r);
vis[s[u][i].b]--;
}
}
}
int main(){
int i,j,a;
node tmp;
while(scanf("%d%d",&n,&m)!=EOF){
ans=INF;
for(i=0;i<=n;i++)
s[i].clear();
memset(vis,0,sizeof(vis));
for(i=0;i<m;i++){
scanf("%d",&a);
scanf("%d%d%d%d",&tmp.b,&tmp.c,&tmp.p,&tmp.r);
s[a].push_back(tmp);
}
dfs(1,0);
if(ans==INF)
puts("impossible");
else
printf("%d\n",ans);
}
return 0;
}
/*
10 18
1 10 9 0 100
10 1 10 0 100
1 9 8 0 100
9 1 9 0 100
1 8 7 0 100
8 1 8 0 100
1 7 6 0 100
7 1 7 0 100
1 6 5 0 100
6 1 6 0 100
1 5 4 0 100
5 1 5 0 100
1 4 3 0 100
4 1 4 0 100
1 3 2 0 100
3 1 3 0 100
1 2 1 0 100
2 1 2 0 100
*/