SDUT2143最短路径
2016-06-27 21:40
316 查看
图结构练习——最短路径
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
给定一个带权无向图,求节点1到节点n的最短路径。
输入
输入包含多组数据,格式如下。第一行包括两个整数n m,代表节点个数和边的个数。(n<=100)
剩下m行每行3个正整数a b c,代表节点a和节点b之间有一条边,权值为c。
输出
每组输出占一行,仅输出从1到n的最短路径权值。(保证最短路径存在)
示例输入
3 2 1 2 1 1 3 1 1 0
示例输出
1 0
思路
假设当前从1到任何一个点(不包含本身)的距离为无穷大,然后逐个遍历,以下代码是以权值为基准更新,由小到大,当这个点已经被遍历过,那就用标记变量标记一下,最后判定,min(从 1 到 j,从 1 到 x 再到 j)。
示例程序
#include <bits/stdc++.h> using namespace std; const int MX = 110; const int inf = 0x3f3f3f3f; int min(int a,int b) { return a<b?a:b; } int mp[MX][MX]; int vis[MX]; int dis[MX]; int n, m; void find() { memset(vis,0,sizeof(vis)); for( int i = 1;i <= n;i++ ) { i==1?dis[i] = 0:dis[i] = inf ; } for( int i = 1;i <= n;i++ ) { int x, mn = inf ; for( int j = 1;j <= n;j++ ) { if( !vis[j]&&mn>=dis[j]) { mn = dis[j]; x = j; } } vis[x] = 1; for( int j = 1; j <= n;j++ ) { dis[j] = min(dis[j],dis[x]+mp[x][j]); } } } int main() { while(cin>>n>>m) { for( int i = 1;i <= n;i++ ) { for( int j = 1; j <= n;j++ ) { mp[i][j] = inf ; } } for( int i = 1;i <= m;i++ ) { int a,b,c; cin>>a>>b>>c; if( mp[a][b]>c ) { mp[a][b] = c; mp[b][a] = c; } } find(); cout<<dis <<endl; } return 0; }
相关文章推荐
- 详解图的应用(最小生成树、拓扑排序、关键路径、最短路径)
- python编写的最短路径算法
- 【算法】最短路径之A*搜索
- Dijkstra和floyd——求单源点最短路径
- 初学图论-Dijkstra单源最短路径算法基于优先级队列(Priority Queue)的实现
- poj 1511 Invitation Cards
- 最少步数BFS
- 想讨论一个指定必经节点求最短路径思路,大伙有什么思路没有?
- Six Degrees of Cowvin Bacon(最短路径floyd算法)
- 关于N*N方格从(1,1)到(N,N)的最短距离
- 最短路径问题迪杰斯特拉(Dijkstra)Android 测试
- HUD----3790最短路径问题
- dijkstra_最短路径_hdu_3790
- poj_1135_最短路径&枚举
- hdu1874 最短路径 畅通工程续
- arcgis for android 短路径分析 查找最短路径
- 单源最短路径 : Bellman-Ford 算法
- 每对顶点的最短路径 : 基本算法
- 每对顶点的最短路径 : Johnson 算法
- 遗传算法染色体变长编码的实现