题目:http://acm.hdu.edu.cn/showproblem.php?pid=4522
建两个图,分别用dijstra。
#include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<string> #include<algorithm> #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const int maxn = 205; const int inf = 0x3fffffff; int map[2][maxn][maxn]; int dist[2][maxn]; int vis[maxn]; int n,t,a,b; void dijstra(int flag){ memset(vis, 0, sizeof(vis)); int i, j, k; for (i=1; i<=n; ++i) dist[flag][i] = inf; for (dist[flag][a]=0, i=1; i<=n; ++i){ for(k=-1, j=1; j<=n; ++j){ if (!vis[j] && (k == -1 || dist[flag][j] < dist[flag][k])) k = j; } for(vis[k]=1, j=1; j<=n; ++j) { if (!vis[j] && dist[flag][k] + map[flag][k][j] < dist[flag][j]) dist[flag][j] = dist[flag][k] + map[flag][k][j]; } } } int main(){ int q; scanf("%d",&q); while(q--){ scanf("%d%d",&n,&t); for(int i = 1;i <= n;i++) for(int j = 1;j <= n;j++){ map[0][i][j] = inf; map[1][i][j] = inf; } for(int i = 0;i < t;i++){ int tmp[25*maxn]; char c = '+'; int j = 0; while (c == '+'){ scanf("%d", &tmp[j++]); c = getchar(); } //for(int i = 0;i < j;i++) // printf("%d ",tmp[i]); int flag; scanf("%d",&flag); if(flag){ for(int k = 1;k < j;k++){ map[0][tmp[k-1]][tmp[k]] = 1; map[1][tmp[k-1]][tmp[k]] = 1; } } else for(int k = 1;k < j;k++) map[1][tmp[k-1]][tmp[k]] = 1; } for (int i=0; i<=n; i++) map[0][i][i] = map[1][i][i] = 0; int d1,d2; scanf("%d%d",&d1,&d2); scanf("%d%d",&a,&b); dijstra(0); dijstra(1); if (dist[0][b] >= inf && dist[1][b] >= inf) puts("-1"); else if (dist[0][b] >= inf) printf("%d\n",dist[1][b]*d1); else if (dist[1][b] >= inf) printf("%d\n", dist[0][b]*d2); else printf("%d\n", min(dist[0][b]*d2, dist[1][b]*d1)); } return 0; }