您的位置:首页 > 其它

ACM 2. 旅行计划(水最短路)

2014-08-16 15:33 176 查看


2. 旅行计划

★☆ 输入文件:
djs.in
输出文件:
djs.out
简单对比

时间限制:3 s 内存限制:128 MB

过暑假了,阿杜准备出行旅游,他已经查到了某些城市的两两之间的距离及可行路线(可行路线有方向),如下图所示。请你编程计算从阿杜所住城市到其它城市的最短路径以帮助阿杜制定旅行计划。



【输入格式】
输入由若干行组成,第一行有三个整数,n(1≤n≤100)、m(1≤m≤n*n)、v(1≤m≤n);城市数,m城市间道路数,v是阿杜所住城市。第2至m+1行是每条路的信息,每行三个整数,为道路的起点、终点和两城市间距离。(城市从0开始编号)
【输出格式】
n组(按城市编号由小至大),每组三行
第一行:城市编号及一个冒号
第二行:path及一个冒号,后面是最短路径节点编号序列(编号间用一个空格隔开)
第三行:cost及一个冒号,后面是一个整数,表示路径距离
如果没有通路则输出 no
【输入样例】
6 8 0
0 2 10
0 4 30
0 5 100
1 2 5
2 3 50
3 5 10
4 3 20
4 5 60

【输出样例】
0:
no
1:
no
2:
path:0 2
cost:10
3:
path:0 4 3
cost:50
4:
path:0 4
cost:30
5:
path:0 4 3 5
cost:60


水最短路

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

#define INF 99999999
#define MAX_N 100

int n,m,v;
int dis[MAX_N];
int map[MAX_N][MAX_N];
int path[MAX_N];
int cost[MAX_N];
bool used[MAX_N];

void dijkstra(int s)
{
fill(dis,dis+n,INF);
dis[s]=0;
path[s]=-1;
memset(used,0,sizeof(used));

while(true)
{
int tv=-1;
for(int u=0;u<n;u++) if(!used[u] && (tv==-1 ||  dis[tv]>dis[u])) tv=u;

if(tv==-1) break;
used[tv]=true;

for(int u=0;u<n;u++) if(!used[u] && dis[u]>dis[tv]+map[tv][u])
{
path[u]=tv;
dis[u]=dis[tv]+map[tv][u];
}
}
}
int fpath[MAX_N];
int fcnt;

void PrintPath(int p)
{
if(p!=-1)
{
PrintPath(path[p]);
fpath[fcnt++]=p;
}
}

int main()
{
freopen("djs.in","r",stdin);
freopen("djs.out","w",stdout);
cin>>n>>m>>v;

for(int i=0;i<n;i++) for(int j=0;j<n;j++) map[i][j]=INF;
for(int i=0;i<m;i++)
{
int b,e,c;

cin>>b>>e>>c;
map[b][e]=c;
}

dijkstra(v);

for(int i=0;i<n;i++)
{
cout<<i<<":"<<endl;
if(dis[i]==INF || path[i]==-1) cout<<"no"<<endl;
else
{
cout<<"path:";
fcnt=0;
PrintPath(i);
for(int j=0;j<fcnt-1;j++)
{
cout<<fpath[j]<<" ";
}
cout<<fpath[fcnt-1]<<endl;
cout<<"cost:"<<dis[i]<<endl;
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: