hdu 2066 一个人的旅行
2012-07-25 18:14
239 查看
点击打开链接
Dij
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 1007483647 //切记尽量不要超过2147483648/2
int map[1200][1200]; //模拟构造个无向图
int s[1200]; //存放与草儿家连接的地方
int d[1200]; //存放草儿想到的地方
int T,S,D,max; ///注意max的作用,记录出现地方的最大值(即,地方的代码1,2,3……)
int count[1200]; //存放从某起点到任意终点的时间
int flag[1200]; //作变量使用,仅此而已
int dijkstra(int x)
{
int i,j,k,d_min,d_ans; //d_min 即在此循环中的最小量,作变量使用,d_ans为临时最最小答案
memset(count,0,sizeof(count)); //初始化很重要
memset(flag,0,sizeof(flag)); //
for(i=1;i<=max;i++)
{
count[i] = map[x][i];
flag[i]=0;
}
count[x]=0;
flag[x]=1;
for(i=1;i<=max;i++){
d_min=MAX;
for(j=1;j<=max;j++){
if(flag[j]==0&&count[j]<d_min){
d_min = count[j];
k=j;
}
}
flag[k]=1;
for(j=1;j<=max;j++){
if(flag[j]==0&&count[j]>count[k]+map[k][j])
count[j] = count[k]+map[k][j];
}
}
d_min=MAX;
for(i=1;i<=D;i++){ ////
if(count[d[i]]<d_min)
d_min=count[d[i]];
}
return d_min;
}
int main()
{
int i,j,a,b,time,m_min,m_ans; ////
while(scanf("%d%d%d",&T,&S,&D)!=EOF)
{
m_ans=MAX;
max=0;
for(i=0;i<1200;i++)
for(j=0;j<1200;j++)
map[i][j]=MAX;
for(i=0;i<T;i++)
{
scanf("%d%d%d",&a,&b,&time);
if(map[a][b]>time)
map[a][b]=time;
if(map[b][a]>time)
map[b][a]=time;
if(a>max)max = a;
if(b>max)max = b;
}
for(i=1;i<=S;i++)
scanf("%d",&s[i]);
for(i=1;i<=D;i++)
scanf("%d",&d[i]);
for(i=1;i<=S;i++) ///依次从与草儿家相连的地方计算
{
m_min=dijkstra(s[i]);
if(m_min<m_ans)
m_ans=m_min;
}
printf("%d\n",m_ans);
}
return 0;
}
Dij
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 1007483647 //切记尽量不要超过2147483648/2
int map[1200][1200]; //模拟构造个无向图
int s[1200]; //存放与草儿家连接的地方
int d[1200]; //存放草儿想到的地方
int T,S,D,max; ///注意max的作用,记录出现地方的最大值(即,地方的代码1,2,3……)
int count[1200]; //存放从某起点到任意终点的时间
int flag[1200]; //作变量使用,仅此而已
int dijkstra(int x)
{
int i,j,k,d_min,d_ans; //d_min 即在此循环中的最小量,作变量使用,d_ans为临时最最小答案
memset(count,0,sizeof(count)); //初始化很重要
memset(flag,0,sizeof(flag)); //
for(i=1;i<=max;i++)
{
count[i] = map[x][i];
flag[i]=0;
}
count[x]=0;
flag[x]=1;
for(i=1;i<=max;i++){
d_min=MAX;
for(j=1;j<=max;j++){
if(flag[j]==0&&count[j]<d_min){
d_min = count[j];
k=j;
}
}
flag[k]=1;
for(j=1;j<=max;j++){
if(flag[j]==0&&count[j]>count[k]+map[k][j])
count[j] = count[k]+map[k][j];
}
}
d_min=MAX;
for(i=1;i<=D;i++){ ////
if(count[d[i]]<d_min)
d_min=count[d[i]];
}
return d_min;
}
int main()
{
int i,j,a,b,time,m_min,m_ans; ////
while(scanf("%d%d%d",&T,&S,&D)!=EOF)
{
m_ans=MAX;
max=0;
for(i=0;i<1200;i++)
for(j=0;j<1200;j++)
map[i][j]=MAX;
for(i=0;i<T;i++)
{
scanf("%d%d%d",&a,&b,&time);
if(map[a][b]>time)
map[a][b]=time;
if(map[b][a]>time)
map[b][a]=time;
if(a>max)max = a;
if(b>max)max = b;
}
for(i=1;i<=S;i++)
scanf("%d",&s[i]);
for(i=1;i<=D;i++)
scanf("%d",&d[i]);
for(i=1;i<=S;i++) ///依次从与草儿家相连的地方计算
{
m_min=dijkstra(s[i]);
if(m_min<m_ans)
m_ans=m_min;
}
printf("%d\n",m_ans);
}
return 0;
}
相关文章推荐
- HDU 2066 一个人的旅行(Dijkstra,建图很巧妙)
- hdu 2066 一个人的旅行 spfa + 建超级源点汇点
- Hdu 2066 一个人的旅行(dijkstra算法,超级起点)
- HDU-2066 一个人的旅行(最短路[Floyd])
- HDU 2066 一个人的旅行.
- hdu_oj_2066 一个人的旅行
- [最短路径] HDU 2066 - 一个人的旅行
- hdu 2066 一个人的旅行 最短路径
- HDU 2066 一个人的旅行【dijkstra】
- HDU 2066 一个人的旅行
- 一个人的旅行 HDU 2066 &&HDU Today HDU 2112
- HDU - 2066 - 一个人的旅行
- HDU 2066 一个人的旅行
- HDU 2066 一个人的旅行
- 一个人的旅行 HDU - 2066
- HDU-2066-一个人的旅行
- hdu 2066 一个人的旅行(单源最短路dijkstra)and hdu 2544
- hdu-2066-一个人的旅行
- HDU 2066 一个人的旅行
- HDU 2066 一个人的旅行【最短路,多起点多终点,Dijkstra算法+spfa算法】