题意同上
连接:http://acm.hdu.edu.cn/showproblem.php?pid=2544
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
#include <iostream> using namespace std; #define INF 0x3fffffff #define MAX (10000+10) int dis[MAX]; int map[MAX][MAX]; int used[MAX]; void init(int n)//各种初始化 { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { map[i][j]=INF; } } for(int k=1;k<=n;k++) { dis[k]=INF; } memset(used,0,sizeof(used)); } int dijkstra(int start,int end,int n) { int minNode; dis[start]=0; for(int cnt=1;cnt<=n;cnt++) { int min=INF; for(int i=1;i<=n;i++) { if(!used[i]&&dis[i]<min) { min=dis[i]; minNode=i; } } used[minNode]=1; for(int k=1;k<=n;k++) { if(!used[k]&&dis[k]>dis[minNode]+map[minNode][k])//松弛操作 { dis[k]=dis[minNode]+map[minNode][k]; } } } return dis[end]; } int main() { int m; int a; int b; int c; int n; while(cin>>n>>m,n+m) { init(n); while(m--) { cin>>a>>b>>c; map[b][a]=c; map[a][b]=c; } cout<<dijkstra(1,n,n)<<endl; } return 0; }