您的位置:首页 > 其它

HDU 2066 一个人的旅行

2012-05-21 21:48 260 查看
/*
这道题原来WA,错误找了蛮久的,问题出在①处,因为两个城市之间可能存在两条道路。

解题思路:增加一个超级源点,从它到邻近城市的距离为0.
*/
#include <cstdio>
#include <cstring>
const int nMax = 1007;
const int INF = 1<<30;
int G[nMax][nMax];
int T, S, D, N;
int s[nMax], d[nMax];
int dis[nMax];
int ans;
void init()
{
int i;
N = 0;
memset(G, -1 , sizeof(G));
for(i = 0; i < T; ++ i)
{
int a, b, w;
scanf("%d%d%d", &a, &b, &w);
if(a > N) N = a;
if(b > N) N = b;
if(G[a][b] < 0 || G[a][b] > w)//①这里WA
G[a][b] = G[b][a] = w;
}
for(i = 0; i < S; ++ i)
{
scanf("%d", &s[i]);
G[s[i]][0] = G[0][s[i]] = 0;
}
for(i = 0; i < D; ++ i)
scanf("%d", &d[i]);
ans = INF;
}
void dijkstra()
{
int i;
for(i = 0; i < nMax; ++ i)
dis[i] = INF;
dis[0] = 0;
bool visit[nMax];
memset(visit, 0, sizeof(visit));
for(i = 1; i <= N; ++ i)
{
int j, m, x;
m = INF;
for(j = 0; j <= N; ++ j) if(!visit[j] && dis[j] < m) m = dis[x = j];
visit[x] = 1;
for(j = 0; j <= N; ++ j) if(!visit[j] && G[x][j] >= 0 && dis[x] + G[x][j] < dis[j])
dis[j] = dis[x] + G[x][j];
}
for(i = 0; i < D; ++ i)
if(dis[d[i]] < ans)
ans = dis[d[i]];
}
int main()
{
//freopen("f://data.in", "r", stdin);
while(scanf("%d %d %d", &T, &S, &D) != EOF)
{
init();
dijkstra();
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: