hdu 2066 一个人的旅行
2014-04-09 10:04
190 查看
基本的最短路,,只不过为多源多汇,可以建立超级源点和终点。。。
具体思路为:
1、选取0为起点,并把所有的起点到0的点距离设为1;
2、选取最大值+1点为终点,并把所有的终点到此终点的距离设为1;
3、求0到最大值+1点为终点的最短路径。。。
附上代码:
#include<stdio.h>
#include<string.h>
int map[1002][1002];
int vis[1002];
int divs[1002];
int n;
int max(int a,int b)
{
return a>b?a:b;
}
void dij(int a)
{
for(int i=0; i<=n; i++)
divs[i]=map[0][i];
divs[0]=0;
vis[0]=1;
for(int i=1; i<=n; i++)
{
int min=0x7ffffff;
int t=-1;
for(int j=0; j<=n; j++)
if(!vis[j]&&divs[j]<min)
min=divs[j],t=j;
if(t==-1)
return ;
vis[t]=1;
for(int j=0; j<=n; j++)
if(!vis[j]&&divs[j]>map[t][j]+divs[t])
divs[j]=map[t][j]+divs[t];
}
}
int main()
{
int t,s,d;
while(~scanf("%d%d%d",&t,&s,&d))
{
memset(vis,0,sizeof(vis));
for(int i=0; i<1002; i++)
for(int j=0; j<1002; j++)
map[i][j]=0x7ffffff;
n=0;
for(int i=0; i<t; i++)
{
int a,b,time;
scanf("%d%d%d",&a,&b,&time);
if(map[a][b]>time)
map[a][b]=map[b][a]=time;
if(n<max(a,b))
n=max(a,b);
}
n++;
//printf("*%d\n",n);
int z;
for(int i=0; i<s; i++)
scanf("%d",&z),map[0][z]=map[z][0]=1;
for(int i=0; i<d; i++)
scanf("%d",&z),map[z]
=map
[z]=1;
dij(n);
printf("%d\n",divs
-2);
}
return 0;
}
具体思路为:
1、选取0为起点,并把所有的起点到0的点距离设为1;
2、选取最大值+1点为终点,并把所有的终点到此终点的距离设为1;
3、求0到最大值+1点为终点的最短路径。。。
附上代码:
#include<stdio.h>
#include<string.h>
int map[1002][1002];
int vis[1002];
int divs[1002];
int n;
int max(int a,int b)
{
return a>b?a:b;
}
void dij(int a)
{
for(int i=0; i<=n; i++)
divs[i]=map[0][i];
divs[0]=0;
vis[0]=1;
for(int i=1; i<=n; i++)
{
int min=0x7ffffff;
int t=-1;
for(int j=0; j<=n; j++)
if(!vis[j]&&divs[j]<min)
min=divs[j],t=j;
if(t==-1)
return ;
vis[t]=1;
for(int j=0; j<=n; j++)
if(!vis[j]&&divs[j]>map[t][j]+divs[t])
divs[j]=map[t][j]+divs[t];
}
}
int main()
{
int t,s,d;
while(~scanf("%d%d%d",&t,&s,&d))
{
memset(vis,0,sizeof(vis));
for(int i=0; i<1002; i++)
for(int j=0; j<1002; j++)
map[i][j]=0x7ffffff;
n=0;
for(int i=0; i<t; i++)
{
int a,b,time;
scanf("%d%d%d",&a,&b,&time);
if(map[a][b]>time)
map[a][b]=map[b][a]=time;
if(n<max(a,b))
n=max(a,b);
}
n++;
//printf("*%d\n",n);
int z;
for(int i=0; i<s; i++)
scanf("%d",&z),map[0][z]=map[z][0]=1;
for(int i=0; i<d; i++)
scanf("%d",&z),map[z]
=map
[z]=1;
dij(n);
printf("%d\n",divs
-2);
}
return 0;
}
相关文章推荐
- hdu 2066 一个人的旅行 SPFA
- 一个人的旅行_hdu_2066(dijkstra).java
- Hdu 2066 一个人的旅行
- HDU 2066一个人的旅行
- hdu-2066 一个人的旅行(最短路spfa)
- hdu 2066 一个人的旅行 最短路
- hdu 2066 一个人的旅行(dijkstra)
- HDU 2066 一个人的旅行(最短路的简单题)
- HDU 2066 一个人的旅行.
- hdu 2066 一个人的旅行【Dijkstra 12级新生训练—图论E】
- hdu 2066 一个人的旅行 dijkstra
- HDU 2066 一个人的旅行【最短路,多起点多终点,Dijkstra算法+spfa算法】
- hdu 2066 一个人的旅行(最短路径 Dijkstra算法)
- 杭电 hdu 2066 一个人的旅行
- HDU 2066 一个人的旅行
- HDU - 2066 一个人的旅行(最短路径)(模板)
- hdu 2066一个人的旅行(多源最短路径Floyd)
- HDU 2066 一个人的旅行(Dijkstra+Floyd)
- hdu 2066:一个人的旅行
- hdu 2066 一个人的旅行(裸dijkstra)