您的位置:首页 > 其它

HDU_2066 一个人的旅行(Dijkstra)

2011-09-07 11:10 309 查看
  开始用Floyd做的,TLE!更二的时我自己找了一组1 1000 的数据,4S才算出来,本身程序就有问题,我居然还交上去了。。。后来用Dijkstra做,过了。。。200+ms;

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int N = 1005;
const int inf = 1000000;

int dis

;
int low
;
int vis
;
int num1
;
int num2
;

void Dijkstra(int n, int v)
{
int flag, min, i, j;
for(i = 1; i <= n; i++)
{
low[i] = dis[v][i];
vis[i] = 0;
}

vis[v] = 1;
for(i = 2; i <= n; i++)
{
min = inf; flag = v;
for(j = 2; j <= n; j++)
{
if(min > low[j] && !vis[j])
{
min = low[j];
flag = j;
}
}
vis[flag] = 1;

for(j = 2; j <= n; j++)
if(!vis[j] && dis[flag][j] < inf)
{
int tmp = low[flag] + dis[flag][j];
if(tmp < low[j])
low[j] = tmp;
}
}

}
int main()
{
//freopen("data.in", "r", stdin);

int t, s, d;
while(~scanf("%d%d%d", &t, &s, &d))
{
int a, b, c, i, j, max = -inf;

for(i = 1; i <= N; i++)
for(j = 1; j <= N; j++)
{
if(i == j)
dis[i][j] = 0;
else
dis[i][j] = inf;
}

for(i = 1; i <= t; i++)
{
scanf("%d%d%d", &a, &b, &c);
if(c < dis[a][b])
dis[a][b] = dis[b][a] = c;
if(max < a)    max = a;
if(max < b)    max = b;
}

for(i = 1; i <= s; i++)
scanf("%d", &num1[i]);

for(i = 1; i <= d; i++)
scanf("%d", &num2[i]);

int min = inf;
for(i = 1; i <= s; i++)
{
Dijkstra(max, num1[i]);
for(j = 1; j <= d; j++)
{
if(min > low[num2[j]])
min = low[num2[j]];
}
}
printf("%d\n", min);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: