您的位置:首页 > 其它

Hdu 2066 一个人的旅行

2012-08-26 19:45 357 查看
先试了试Floyd算法,结果没弄出来。然后试了试单源Dijsktra最短路径,两层循环找出最小的结果,建图的过程中遇到了小麻烦,有时间的话再写一写Floyd算法。

CODE:

#include <cstdio>
#include <cstdlib>
#include <string>
using namespace std;

const int SIZE = 1010;
const int INF = 0x3fffffff;

int w[SIZE][SIZE];
int v[SIZE], d[SIZE];
int T, S, D, tot;
int link[SIZE], want[SIZE];

int max(int x, int y)
{
return x > y ? x : y;
}

void Dijkstra(int src, int n)
{
int i, j;
memset(v, 0, sizeof(v));
for(i = 1; i <= n; i++) d[i] = (i == src)? 0 : INF;
for(i = 1; i <= n; i++)
{
int x, m = INF;
for(int y = 1; y <= n; y++) if(!v[y] && m >= d[y]) m = d[x=y];
v[x] = 1;
for(int y = 1; y <= n; y++) d[y] <?= d[x]+w[x][y];
}
}

void init()
{
for(int i = 1; i <= SIZE; i++)
{
for(int j = 1; j <= SIZE; j++)
{
w[i][j] = w[j][i] = INF;
}
}
memset(d, 0, sizeof(d));
memset(link, 0, sizeof(link));
memset(want, 0, sizeof(want));
}

int main()
{
int i, j;
while(~scanf("%d%d%d", &T, &S, &D))
{
init();
tot = 0;
for(i = 1; i <= T; i++)
{
int u, v, w1;
scanf("%d%d%d", &u, &v, &w1);
if(w1 < w[u][v]) //判重边,不加这句话WA了N次。
{
w[u][v] = w[v][u] = w1;
}
tot >?= max(u, v);
}
for(i = 1; i <= S; i++) scanf("%d", &link[i]);
for(i = 1; i <= D; i++) scanf("%d", &want[i]);
int ans = INF, min;
for(i = 1; i <= S; i++)
{
Dijkstra(link[i], tot);
min = INF;
for(j = 1; j <= D; j++)
{
min <?= d[want[j]];
}
ans <?= min;
}
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: