洛谷P3371 单源最短路径
考点
- 最短路
- SPFA或dijistra的堆优化
题意
洛谷原题链接
非常裸的最短路题目,做来练练手。
思路
单源最短路,SPFA走起。SPFA快又好写。
额外
这道题数据十分给力,dijistra模板是过不了的,要加堆优化。但是信奉SPFA的我不方!
第一次WA了一个点,把memset(dis,2147483647,sizeof(dis))
换成
for(int i=1;i<=maxnode;++i) dis[i]=2147483647
后就A了…
不要信memset!
还有,边是有向边,因此add_Edge时不要建立另外一条
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxnode=10001;
const int maxline=500001;
int startnode,totnode,totline;
long long dis[maxnode];
struct lsqqx
{
int to;
int value;
int nxt;
}edge[maxline];
int cnt=0;
int head[maxnode];
#define forline(i,x) for(int i=head[x];i!=-1;i=edge[i].nxt)
queue<int> team;
bool exist[maxnode];
void add_Edge(int x,int y,int val)
{
edge[cnt].nxt=head[x];
edge[cnt].to=y;
edge[cnt].value=val;
head[x]=cnt;
cnt++;
}
void SPFA(int s)
{
dis[s]=0;
team.push(s);
int will;
int nownode;
while(!team.empty())
{
nownode=team.front();
team.pop();
exist[nownode]=0;
forline(i,nownode)
{
will=edge[i].to;
if(dis[will]>dis[nownode]+edge[i].value)
{
dis[will]=dis[nownode]+edge[i].value;
if(!exist[will])
{
exist[will]=1;
team.push(will);
}
}
}
}
}
int main()
{
for(int i=1;i<=maxnode;++i) dis[i]=2147483647;
memset(head,-1,sizeof(head));
scanf("%d%d%d",&totnode,&totline,&startnode);
int x,y,z;
for(int i=1;i<=totline;++i)
{
scanf("%d%d%d",&x,&y,&z);
add_Edge(x,y,z);
}
SPFA(startnode);
for(int i=1;i<=totnode-1;++i)
{
printf("%lld ",dis[i]);
}
printf("%lld\n",dis[totnode]);
}