1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| #include<cstdio> #include<cstring> #define INF 1e4+10 using namespace std; const int M=1e4+10; const int N=1000+10; int n,m,s; int mp[N][M]; int dis[N],vis[N];
void initmp(){ memset(mp,INF,sizeof(mp)); } void dijkstra(int s){ memset(vis,0,sizeof(vis)); memset(dis,0x3f,sizeof(dis)); dis[s]=0; while(1){ int mini=0,min_=INF; for(int j=1;j<=n;j++){ if(!vis[j]&&min_>dis[j]){ mini=j; min_=dis[j]; } } if(mini==0) break; vis[mini]=1; for(int i=1;i<=n;i++){ if(dis[i]>dis[mini]+mp[mini][i]) dis[i]=dis[mini]+mp[mini][i]; } } } int main(){ memset(mp,INF,sizeof(mp)); while(scanf("%d %d",&n,&m)!=EOF&&n){ initmp(); for(int i=0;i<m;i++){ int u,v,w; scanf("%d %d %d",&u,&v,&w); if(mp[u][v]>w) mp[u][v]=mp[v][u]=w; } dijkstra(1); printf("%d\n",dis[n]); } return 0; }
|