dijksta 最短路径算法
#include<iostream> #include<string.h> #include<math.h> #include<vector> using namespace std; int n,m,k; int ans; int mod=1e9+7; int a[105][105]; //bool vis[105]; const int N=1001; const int M=10001; struct edge{ int v,w,next; edge(){}; edge(int _v,int _w,int _next){ //_v 连接的点 _w 权值 _next 下一个点 v=_v; w=_w; next=_next; } }e[M*2]; int head[N],size;//表示当前一共的边数 void init(){ memset(head,-1,sizeof(head)); size=0; } void insert(int u,int v,int w){ e[size]=edge(v,w,head[u]); head[u]=size++; } void insert2(int u,int v,int w){ insert(u,v,w); insert(v,u,w); } int dis[N]; bool vis[N]; void dijkstra(int u){ memset(vis,false,sizeof(vis)); memset(dis,0x3f,sizeof(dis)); dis[u]=0; for(int i=0;i<n;i++){ int mind=1000000,minj=-1; for(int j=1;j<=n;j++){ if(!vis[j]&&dis[j]<mind){ minj=j; mind=dis[j]; } } if(minj==-1){ return; } vis[minj]=true; for(int j=head[minj];~j;j=e[j].next){ int v=e[j].v; int w=e[j].w; if(!vis[j]&&dis[v]>dis[minj]+w){ dis[v]=dis[minj]+w; } } } } int main(){ init(); int u,v,w; cin>>n>>m; while(m--){ cin>>u>>v>>w; insert2(u,v,w); } dijkstra(1); cout<<dis[n]<<endl; return 0; }