#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=1000;
const int maxm=maxn*maxn;
const int INF=0x3f3f3f3f;
struct Edge {
int from,to,w,next;
};
int n,m;
int pre[maxn]; //前向星
Edge e[maxm];//边集
int vis[maxn];//是否已加入确定点集
int dis[maxn];//到始点的距离
int main()
{
#ifdef LOCAL_DEBUG
freopen("input.txt","r",stdin);
#endif
while(scanf("%d%d",&n,&m)!=EOF && n+m )
{
memset(pre,-1,sizeof(pre));
int from,to,w;
//保证存在1到n的最短路
for(int i=0;i<m;i++) //建图
{
scanf("%d%d%d",&from,&to,&w);
if(from==to) continue;
e[i].from=from; e[i].to=to; e[i].w=w;
e[i].next=pre[from]; pre[from]=i;
std::swap(from,to);
e[i+m].from=from; e[i+m].to=to; e[i+m].w=w;
e[i+m].next=pre[from]; pre[from]=i+m;
}
memset(vis,0,sizeof(vis));
memset(dis,INF,sizeof(dis));
dis[1]=0; //从定点1出发
for(int i=0;i<n;i++) //n次循环,每次利用一个节点更新dis数组
{
int mine=INF,v;
for(int i=1;i<=n;i++) //寻找距离最近且未加入确定最短路径的点
{
if(vis[i]) continue;
if(dis[i]<=mine) { mine=dis[i]; v=i; }
}
vis[v]=1;
for(int k=pre[v];k!=-1;k=e[k].next) //松弛操作
{
int to=e[k].to;
int w=e[k].w;
if(vis[to]) continue;
if(dis[v]+w<dis[to]) dis[to]=dis[v]+w;
}
}
for(int i=1;i<=n;i++) //输出到每个节点的最短距离
printf("%d\n",dis[i]);
}
return 0;
}
最短路的前向星实现
最新推荐文章于 2019-10-15 23:16:41 发布