(DIjsktra算法) nyoj1401-一场说走就走的旅行

mac2022-06-30  106

题目描述:

有一天,孩子回来对我说:妈妈,听说马尔代夫很不错,放假了我想去玩。马尔代夫?我也想去!没有人不向往一场说走就走的旅行!其实我想去的地方很多,呼伦贝尔大草原、玉龙雪山、布达拉宫、艾菲尔铁塔……”小孩子还说着他感兴趣的地方。于是我们拿出地图,标出想去的地点,然后计算最短路线,估算大约所需的时间,有了这张秘制地图,一场说走就走的旅行不是梦!

 

给定有向带权图G =V,其中每条边的权是非负实数。此外,给定V中的一个顶点,称为源点。现在要计算从源到所有其他各顶点的最短路径长度,这里路径长度指路上各边的权之和。

 

输入描述:

第一行是一个整型数m(m<100)表示共有m组测试数据。 每组测试数据的第一行是两个整数n,c(1<n,c<1000)表示该测试数据有n个城市c条边。 随后的c行,每行有3个正整数u,v,w(0<u,v<=n, 0<w<10000),分别表示边的两个顶点编号u,v及两顶点之间的距离。 最后一行,源点的编号s(0<s<=n)。

输出描述:

对于每一组输入,输出n个整数,代表源点到其它顶点的最短距离。如果源点不能到达其他顶点输出“impossible”。 每组的输出占一行。

样例输入:

复制 2 5 11 1 5 12 5 1 8 1 2 16 2 1 29 5 2 32 2 4 13 4 2 27 1 3 15 3 1 21 3 4 7 4 3 19 5 3 5 1 2 6 1 3 13 2 1 10 2 3 4 3 1 5 1

样例输出:

8 24 23 30 0 0 6 10dijkstra算法模板题C++代码: #include<iostream> #include<cstdio> using namespace std; const int INF = 0x3f3f3f3f; const int maxn = 1000+10; int mp[maxn][maxn],dis[maxn],book[maxn],node,edge; void dijkstra(int x){ for(int i = 1; i <= node; i++){ dis[i] = mp[x][i]; book[i] = 0; } dis[x] = 0; book[x] = 1; for(int i = 1; i <= node; i++){ int minn = INF,t = x; for(int j = 1;j <= node; j++) if(book[j] == 0 && dis[j] < minn){ minn = dis[j]; t = j; } book[t] = 1; for(int j = 1;j <= node; j++){ if(book[j] == 0 && dis[t] + mp[t][j] < dis[j] && mp[t][j] <INF){ dis[j] = dis[t] + mp[t][j]; } } } } int main(){ int m; scanf("%d",&m); while(m--){ scanf("%d%d",&node,&edge); for(int i = 1; i <= node; i++){ for(int j = 1; j <= node; j++){ mp[i][j] = INF; } } int n,v,w; for(int i = 1; i <= edge; i++){ scanf("%d%d%d",&n,&v,&w); if(w < mp[n][v]) mp[n][v] = w; } int x; scanf("%d",&x); dijkstra(x); for(int i = 1; i <= node; i++){ if(dis[i] == INF){ cout<<"impossible"<<" "; } else{ cout<<dis[i]<<" "; } } cout<<endl; } return 0; }

 

 

转载于:https://www.cnblogs.com/Weixu-Liu/p/10633045.html

最新回复(0)