题目: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;
}