注意:代码正确性无法保证。。。
#include <iostream>
using namespace std;
const int MAXNUM = 1024;
const int MAXARR = 10010;
int rr[MAXARR][MAXARR];
void dijk(int n,int v,int *dist,int *pre)
{
bool visit[MAXARR];
int i,j;
for(i=2;i<=n;i++)
{
visit[i] = false;
dist[i] = rr[v][i];
if(rr[v][i]>=MAXNUM)
{
pre[i] = 0;
}
else
{
pre[i] = v;
}
}
pre[v] = 0;
dist[v] = 0;
visit[v] = true;
for(i=2;i<=n;i++)
{
int temp = MAXNUM;
int u = v;
for(j=1;j<=n;j++)
{
if(!visit[j]&&dist[j]<temp)
{
temp = dist[j];
u = j;
}
}
visit[u] = true;
for(j=1;j<=n;j++)
{
if((!visit[j])&&rr[u][j]<MAXNUM)
{
int newdist = dist[u]+rr[u][j];
if(dist[j]>=newdist)
{
dist[j] = newdist;
if(pre[j]==0)
{
pre[j] = u;
}
else if(rr[pre[j]][j]>rr[u][j])
{
pre[j] = u;
}
}
}
}
}
}
int main()
{
int a,b,c,dist[MAXARR],pre[MAXARR],n,m,i,j;
while(cin>>n>>m)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
rr[i][j] = MAXNUM;
}
}
for(i=0;i<m;i++)
{
cin>>a>>b>>c;
rr[a][b] = rr[b][a] = c;
}
int tt = 0; cout<<endl<<endl;
dijk(n,1,dist,pre);
for(i=1;i<=n;i++)
{
tt+=rr[pre[i]][i];
cout<<dist[i]<<endl;
}
cout<<tt<<endl;
}
return 0;
}
/*
4 5
1 2 4
2 4 3
1 3 5
2 3 2
3 4 2
*/