[SDUT](2143)图结构练习——最短路径 ---单源最短路径(图)
图结构练习——最短路径
Time Limit: 1000MS Memory Limit: 65536KB
Problem Description
给定一个带权无向图,求节点1到节点n的最短路径。
Input
输入包含多组数据,格式如下。
第一行包括两个整数n m,代表节点个数和边的个数。(n<=100)
剩下m行每行3个正整数a b c,代表节点a和节点b之间有一条边,权值为c。
Output
每组输出占一行,仅输出从1到n的最短路径权值。(保证最短路径存在)
Example Input
3 2 1 2 1 1 3 1 1 0
Example Output
1 0
注:加权无向图
AC代码:
#include<iostream> #include<cstring> #define INF 0x3f3f3f3f using namespace std; int mmap[105][105]; bool vis[105]; int dist[105]; int n,m; int mmin; void dijkstra(int n) { int k; for(int i=1;i<=n;i++) dist[i]=mmap[1][i]; vis[1]=true; dist[1]=0; for(int i=1;i<=n;i++) { mmin=INF; k=0; for(int j=1;j<=n;j++) { if(!vis[j] && dist[j]<mmin) { mmin=dist[j]; k=j; } } vis[k]=true; for(int j=1;j<=n;j++) { if(!vis[j] && dist[k]+mmap[k][j]<dist[j]) dist[j]=dist[k]+mmap[k][j]; } } } int main() { while(cin>>n>>m) { int a,b,c; memset(mmap,0,sizeof(mmap)); memset(vis,false,sizeof(vis)); memset(dist,0,sizeof(dist)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) mmap[i][j]=INF; } while(m--) { cin>>a>>b>>c; if(c<mmap[a][b]) { mmap[a][b]=mmap[b][a]=c; } } dijkstra(n); cout<<dist[n]<<endl; } return 0; }
总结:dijkstra算法,基础题目。不过自己做这道题时发生了让自己苦笑不得的事,尽然!把memset(mmap,0,sizeof(mmap));写成了sizeof(mmap,0,sizeof(mmap));交题一直WA or RE,自己还纳闷了半个小时。2333333333,看来自己脑子还是瓦特啦