您的位置:首页 > 其它

HDU 2066 一个人的旅行(Dijkstra,建图很巧妙)

2015-10-14 16:26 423 查看
题目地址:点击打开链接

思路:最开始想floyd会超时,结果学长说最后判断一下就不会超时,后来用Dijkstra做,每次求出一个起点到想去的地方的最小值,最后比较每次求出的最小值,结果老是运行失败,后来学长说只用一次Dijkstra即可,把从家里到他附近的城市之间的距离设为0,这样最后求出的最小值一定会经过她家里附近的城市,和省赛的最小换乘挺相似,看着挺难做,但是图建的比较好,很快就会A了,有一个坑就是有多重边,注意一下就行,做图类的题要随时注意这个坑

AC代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>

using namespace std;

const int maxn = 1010;
const int zui = 1000000000;
int n;
int map1[maxn][maxn],low[maxn],visit[maxn];
int near[maxn],want[maxn];

void Dijkstra()
{
int i,j,k;
int max2;
memset(visit,0,sizeof(visit));
for(i=1; i<=n; i++)
{
low[i] = map1[0][i];
}
for(i=1; i<=n; i++)//每次并一个点,需要并n次
{
max2 = zui;
for(j=1; j<=n; j++)
{
if(!visit[j] && low[j] < max2)
{
k = j;
max2 = low[j];
}
}
visit[k] = 1;
for(j=1; j<=n; j++)
{
if(!visit[j] && low[k] + map1[k][j] < low[j])
{
low[j] = low[k] + map1[k][j];
}
}
}
}

int main()
{
int t,s,d;
int i,j;
int a,b,time;
n = 0;
while(scanf("%d%d%d",&t,&s,&d) != EOF)
{
for(i=0; i<=1000; i++)
{
for(j=0; j<=1000; j++)
{
map1[i][j] = zui;
}
}
for(i=0; i<t; i++)
{
scanf("%d%d%d",&a,&b,&time);
if(time < map1[a][b])
{
map1[a][b] = map1[b][a] = time;
}
n = max(n,max(a,b));
}
for(i=0; i<s; i++)
{
scanf("%d",&near[i]);
map1[0][near[i]] = map1[near[i]][0] = 0;
}
for(i=0; i<d; i++)
{
scanf("%d",&want[i]);
}
Dijkstra();
int min1 = zui;
for(i=0; i<d; i++)
{
if(low[want[i]] < min1)
{
min1 = low[want[i]];
}
}
printf("%d\n",min1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: