#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
#define M 10000+20
int st[M];
int en[M];
int le[M];
int first[M];
int next[M];
int dist[M];
int mark[M];
int main()
{
int n,m;
while(cin>>n>>m)
{
memset(first,-1,sizeof(first));
memset(mark,0,sizeof(mark));
for(int i=1;i<=n;i++) dist[i]=M;
for(int i=1;i<=m;i++)
{
cin>>st[i]>>en[i]>>le[i];
next[i]=first[st[i]];
first[st[i]]=i;
if(st[i]==1) dist[en[i]]=le[i];
}
dist[1]=0;
mark[1]=1;
/*......初......始......化......*/
for(int i=1;i<n;i++)
{
int mini=M;
int mini_now;
for(int j=2;j<=m;j++)
{
if(mark[j]==0&&dist[j]<mini)
{
mini=dist[j];
mini_now=j;
}
}
mark[mini_now]=1;
for(int k=first[mini_now];k!=-1;k=next[k]) //松弛
{
if(le[k]<M)
{
if(dist[mini_now]+le[k]<dist[en[k]])
dist[en[k]]=dist[mini_now]+le[k];
}
}
}
for(int i=1;i<=n;i++)
{
cout<<dist[i]<<" ";
}
cout<<endl;
}
return 0;
}
dijkstral-邻接表
最新推荐文章于 2023-09-16 14:39:41 发布