1.Dijkstra算法
/**************************
dijkstra 模板
假设数据输入时采用如下的格式进行输入:首先输入顶点个数n,边数m。然后输入每条边的数据,
每条边的数据格式为:u v w,分别表示这条边的起点、终点和边上的权值。顶点序号从0开始计
起。
input:
6 9
0 2 5
0 3 30
1 0 2
1 4 8
2 5 7
2 1 15
4 3 4
5 3 10
5 4 18
output:
20 0→2→1
5 0→2
22 0→2→5→3
28 0→2→1→4
12 0→2→5
**************************/
#include <iostream>
using namespace std;
const int SIZE=55;
const int INF=0x7fffffff;
int n,m,a[SIZE][SIZE];
int path[SIZE], dist[SIZE];
void dijkstra(int u0)
{
int S[SIZE];
for(int i=0;i<n;i++)
{
S[i]=0;
dist[i]=a[u0][i];
if(dist[i]<INF) path[i]=u0;
else path[i]=-1;
}
S[u0]=1; dist[u0]=0;
for(int i=1;i<n;i++)
{
int minV=INF, u=-1;
for(int j=0;j<n;j++)
if(!S[j] && minV>dist[j])
{
minV=dist[j];
u=j;
}
S[u]=1;
for(int j=0;j<n;j++)
if(!S[j] && a[u][j]<INF && dist[j]>dist[u]+a[u][j])
{
dist[j]=dist[u]+a[u][j];
path[j]=u;
}
}
}
void print(int s)
{
if(path[s]==-1)
cout<<s;
else
{
print(path[s]);
cout<<"->"<<s;
}
}
int main()
{
int u,v,w;
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]=INF;
for(int i=0;i<m;i++) {cin>>u>>v>>w; a[u][v]=w;}
dijkstra(0);
for(int i=1;i<n;i++)
{
cout<<dist[i]<<"\t";
print(i);
cout<<endl;
}
return 0;
}