您的位置:首页 > 其它

洛谷P3371 单源最短路径

2017-07-06 20:49 323 查看

洛谷P3371 单源最短路径

洛谷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
4000
[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]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  最短路 SPFA