您的位置:首页 > 其它

蓝桥杯 最短路 spfa

2016-03-07 15:56 447 查看
问题描述

给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环)。请你计算从1号点到其他点的最短路(顶点从1到n编号)。

输入格式

第一行两个整数n, m。

接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边。

输出格式
共n-1行,第i行表示1号点到i+1号点的最短路。
样例输入
3 3
1 2 -1
2 3 -1
3 1 2
样例输出
-1
-2
数据规模与约定

对于10%的数据,n = 2,m = 2。

对于30%的数据,n <= 5,m <= 10。

对于100%的数据,1 <= n <= 20000,1 <= m <= 200000,-10000 <= l <= 10000,保证从任意顶点都能到达其他所有顶点。

题解: 前向星 存图 SPFA

#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
#include<queue>
using namespace std;
struct node
{
int next;
int to;
int we;
} edge[200005];
int nedge=0;
int pre[20005],vis[20005],d[20005];
int n,m;
int aa,bb,cc;
int now;
queue<int>q;
void  add (int a,int b ,int c)
{
nedge++;
edge[nedge].to=b;
edge[nedge].we=c;
edge[nedge].next=pre[a];
pre[a]=nedge;
}
void spfa()
{
for(int i=1;i<=n;i++)
{
vis[i]=0;
d[i]=0xfffffff;
}
q.push(1);
vis[1]=1;
d[1]=0;
while(!q.empty())
{
now=q.front();
q.pop();
vis[now]=0;
for(int i=pre[now];i!=0;i=edge[i].next)
{
int mm=edge[i].to;
if(d[now]+edge[i].we<d[mm])
{
d[mm]=d[now]+edge[i].we;
if(!vis[mm])
{
vis[mm]=1;
q.push(mm);
}
}
}
}
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
{
pre[i]=0;
}
memset(edge,0,sizeof(edge));
for(int i=1;i<=m;i++)
{
scanf("%d %d %d",&aa,&bb,&cc);
add(aa,bb,cc);
}
spfa();
for(int i=2;i<=n;i++)
printf("%d\n",d[i]);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: