Dijkstra模板

来源:互联网 发布:易语言编程教学 编辑:程序博客网 时间:2024/05/18 00:28
数据:
60 2 50 3 301 0 21 4 82 5 72 1 154 3 45 3 105 4 18-1 -1 -1
#include<iostream>#include<cstring>#include<cstdio>#define INF 1000000#define MAXN 20int n,Edge[MAXN][MAXN],s[MAXN],dist[MAXN],path[MAXN];void Dijkstra(int v0){int i,j,k;for(i=0;i<n;++i){dist[i] = Edge[v0][i];s[i] = 0;if(i!=v0&&dist[i]<INF)path[i] = v0;else path[i]=-1;}s[v0] = 1; dist[v0] = 0;for(i=0;i<n-1;++i){int min = INF,u=v0;for(j=0;j<n;++j){if(!s[j]&&dist[j]<min){u = j;min = dist[j];}}s[u] = 1;for(k=0;k<n;++k){if(!s[k]&&Edge[u][k]<INF&&dist[u]+Edge[u][k]<dist[k]){dist[k] = dist[u] + Edge[u][k];path[k] = u;}}}}int main(){int i,j;int u,v,w;scanf("%d",&n);while(1){scanf("%d%d%d",&u,&v,&w);if(u==-1&&v==-1&&w==-1)break;Edge[u][v] = w;}for(i=0;i<n;++i){for(j=0;j<n;++j){if(i==j)Edge[i][j] = 0;else if(Edge[i][j]==0)Edge[i][j] = INF;}}Dijkstra(0);int shortest[MAXN];for(i=1;i<n;++i){printf("%d\t",dist[i]);memset(shortest,0,sizeof(shortest));int k=0;shortest[k] = i;while(path[shortest[k]]!=0){k++;shortest[k] = path[shortest[k-1]];}k++;shortest[k] = 0;for(j=k;j>0;j--)printf("%d->",shortest[j]);printf("%d\n",shortest[0]);}return 0;}

0 0
原创粉丝点击