HDU_2066 一个人的旅行(Dijkstra)

  开始用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[N][N];
int low[N];
int vis[N];
int num1[N];
int num2[N];

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);
}
}
原文地址:https://www.cnblogs.com/vongang/p/2169584.html