您的位置:首页 > 其它

hdu 2066 一个人的旅行(单源最短路dijkstra)and hdu 2544

2014-03-26 08:24 435 查看
题意是给几个城市间车程的时间,给几个和女主家【相邻】的城市(这个条件灰常重要啊!),然后给几个女主【想去】的城市,求女主从她家【相邻】城市到【想去】城市的最短时间。

刚开始做以为是多源的最短路,因为给了好多个【相邻】的城市。

因为忽略了女主家也可以作为起点,这样思路一改变,马上就把多源变为了单源。

具体的实现就是把map[女主家][相邻城市]=0,最后用dijkstra求女主【家】到【想去】城市的最短距离就k.o了。

代码:

#include<stdio.h>
const int INF=1 << 29;
const int MaxN=1001;

int T, map[MaxN][MaxN];
bool vis[MaxN];
int len;

void dijkstra()
{
for(int i=0; i<=len; i++)
vis[i]=0;
for(int i=1; i<=len; i++)
{
int timemin=INF,mark=-1;
for(int j=1; j<=len; j++)
{
if(!vis[j] && map[0][j]<timemin)
{
timemin=map[0][j];
mark=j;
}
}
if(timemin==INF) break;
vis[mark]=1;
for(int j=1; j<=len; j++)
{
if(!vis[j] && map[0][j]>map[0][mark]+map[mark][j])
map[0][j]=map[0][mark]+map[mark][j];
}
}
}

int main()
{
#ifndef ONLINE_JUDGE
freopen("2066.txt","r",stdin);
#endif
int S, D;
int i, j;
int s, e, tmp;
int x;
int ans;
while(scanf("%d%d%d", &T, &S, &D)!=EOF)
{
for(i=0; i<MaxN; i++)
for(j=0; j<MaxN; j++)
map[i][j]=INF;

len=0;//用于缩短程序运行时间。
for(i=0; i<T; i++)
{
scanf("%d%d%d",&s,&e,&tmp);
if(tmp<map[s][e])
{
map[s][e]=tmp;
map[e][s]=tmp;
}
if(len<s) len=s;
if(len<e) len=e;
}

for(i=0; i<S; i++)//将看似多源的转换为单源点。设家乡为0,则如到起点1处,则赋0到1的时间为0。
{
scanf("%d",&x);
map[0][x]=0;
}

dijkstra();

ans=INF;
for(i=0; i<D; i++)
{
scanf("%d",&x);
if(ans>map[0][x])
ans=map[0][x];
}
printf("%d\n",ans);
}
return 0;
}


对于2066,2544就显得简单得多了。

就是单纯的求1到N的最短路。

代码:

#include<stdio.h>

const int INF=1 << 29;
const int MaxN=101;

int N, M;
int mp[MaxN][MaxN];
int time[MaxN];
bool vis[MaxN];

void dijkstra()
{
for(int i=1; i<=N; i++)
{
vis[i]=0;
time[i]=INF;
}
time[1]=0;
for(int i=1; i<=N; i++)
{
int mark=-1, mintime=INF;
for(int j=1; j<=N; j++)
{
if(!vis[j] && mintime > time[j])
mintime=time[ mark=j ];
}
vis[mark]=1;
if(mintime==INF) break;
for(int j=1; j<=N; j++)
if(time[j] > time[mark]+mp[mark][j])
time[j] = time[mark]+mp[mark][j];
}
}

int main()
{
int s, e, tmptime;
while(scanf("%d%d",&N,&M)!=EOF)
{
if(N==0&&M==0)
break;
for(int i=0; i<MaxN; i++)
for(int j=0; j<MaxN; j++)
{
if(i==j)
mp[i][j]==0;
else
mp[i][j]=INF;
}

for(int i=0; i<M; i++)
{
scanf("%d%d%d", &s, &e, &tmptime);
if(tmptime < mp[s][e])
mp[s][e]=mp[e][s]=tmptime;
}
dijkstra();
printf("%d\n",time
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: