Easy sssp

时间限制: 1 Sec  内存限制: 128 MB
提交: 103  解决:
20
[提交][状态][讨论版]

题目描述

输入数据给出一个有N(2  < =  N  < =  1,000)个节点,M(M  < =  100,000)条边的带权有向图. 
要求你写一个程序,  判断这个有向图中是否存在负权回路.  如果从一个点沿着某条路径出发,  又回到了自己,  而且所经过的边上的权和小于0, 
就说这条路是一个负权回路. 如果存在负权回路,  只输出一行-1; 如果不存在负权回路,  再求出一个点S(1  < =  S  < = 
N)到每个点的最短路的长度.  约定:    S到S的距离为0,  如果S与这个点不连通,  则输出NoPath.

输入

第一行:  点数N(2  < =  N  < =  1,000),  边数M(M  < =  100,000),  源点S(1 
< =  S  < =  N); 以下M行,  每行三个整数a,  b,  c表示点a,  b(1  < =  a,  b  < = 
N)之间连有一条边,  权值为c(-1,000,000  < =  c  < =  1,000,000)

输出

如果存在负权环,  只输出一行-1,  否则按以下格式输出 共N行,  第i行描述S点到点i的最短路:  如果S与i不连通,  输出NoPath;
如果i  =  S,  输出0; 其他情况输出S到i的最短路的长度.

样例输入

6 8 1
1 3 4
1 2 6
3 4 -7
6 4 2
2 4 5
3 6 3
4 5 1
3 5 4

样例输出

0
6
4
-3
-2
7

提示

做这道题时,  你不必为超时担心,  不必为不会算法担心,  但是如此“简单”的题目,  你究竟能ac么?

题解:这是一道spfa的题目吧,考点是spfa的应用和spfa判断负权回路的问题,每个块都判断一次,若其中有一个块存在负权回路,则直接输出NoPath;如果不存在,则输出最短路即可。

    spfa判断负环应该都知道吧,一个点如果进栈n次则存在负环。

 #include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<string>
#include<cstring> using namespace std;
const int MAXN=,MAXM=; int num,first[MAXN],next[MAXM],arr[MAXM],cost[MAXM];
int times[MAXN];
int n,m,st;
int p[MAXN];
bool boo[MAXN],he[MAXN];
long long dis[MAXN]; void add(int u,int v,int z)
{
num++;
next[num]=first[u];
first[u]=num;
arr[num]=v;
cost[num]=z;
}
void init()
{
memset(he,,sizeof(he));
memset(times,,sizeof(times));
memset(boo,,sizeof(boo));
memset(next,,sizeof(next));
memset(arr,,sizeof(arr));
memset(cost,,sizeof(cost));
for (int i=;i<=n;i++)
first[i]=-;
num=;
for (int i=;i<=n;i++)
dis[i]=;
dis[st]=;
}
bool pan(int st)
{
int head=,tail=;
p[tail]=st,boo[st]=;
times[st]++; while (head!=tail)
{
head=head%n+;
int u=p[head],v;
for (int i=first[u];i!=-;i=next[i])
{
v=arr[i];
if (dis[u]+cost[i]<dis[v])
{
dis[v]=dis[u]+cost[i];
if (boo[v]==)
{
times[v]++;
if (times[v]>=n)
{
return ;
}
boo[v]=;
tail=tail%n+;
p[tail]=v;
}
}
}
boo[u]=;
}
for (int i=;i<=n;i++)
if (dis[i]<) he[i]=;
return ;
}
void solve(int st)
{
int head=,tail=;
p[tail]=st,boo[st]=; while (head!=tail)
{
head=head%n+;
int u=p[head],v;
for (int i=first[u];i!=-;i=next[i])
{
v=arr[i];
if (dis[u]+cost[i]<dis[v])
{
dis[v]=dis[u]+cost[i];
if (boo[v]==)
{
boo[v]=;
tail=tail%n+;
p[tail]=v;
}
}
}
boo[u]=;
}
for (int i=;i<=n;i++)
if (dis[i]==) printf("NoPath\n");
else printf("%lld\n",dis[i]);
}
int main()
{
scanf("%d%d%d",&n,&m,&st);
init(); int x,y,z;
for (int i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
for (int i=;i<=n;i++)
if (he[i]==)
{
for (int i=;i<=n;i++)
dis[i]=;
dis[i]=;
if (pan(i))
{
printf("-1\n");
return ;
}
memset(boo,,sizeof(boo));
memset(times,,sizeof(times));
}
for (int i=;i<=n;i++)
dis[i]=;
dis[st]=;
solve(st);
}

Easy sssp的更多相关文章

  1. vijosP1053 Easy sssp

    vijosP1053 Easy sssp 链接:https://vijos.org/p/1053 [思路] SPFA. 题目中的陷阱比较多,但是只要中规中矩的写SPFA诸如:s与负圈不相连,有重边的情 ...

  2. Easy sssp(spfa)(负环)

    vijos    1053    Easy sssp 方法:用spfa判断是否存在负环 描述 输入数据给出一个有N(2 <= N <= 1,000)个节点,M(M <= 100,00 ...

  3. SPFA_YZOI 1662: Easy sssp

    题目描述 输入数据给出一个有N(2  < =  N  < =  1,000)个节点,M(M  < =  100,000)条边的带权有向图.  要求你写一个程序,  判断这个有向图中是 ...

  4. Vijos1053 Easy sssp[spfa 负环]

    描述 输入数据给出一个有N(2 <= N <= 1,000)个节点,M(M <= 100,000)条边的带权有向图. 要求你写一个程序, 判断这个有向图中是否存在负权回路. 如果从一 ...

  5. Loj10086 Easy SSSP

      试题描述 输入数据给出一个有 N 个节点,M 条边的带权有向图.要求你写一个程序,判断这个有向图中是否存在负权回路.如果从一个点沿着某条路径出发,又回到了自己,而且所经过的边上的权和小于 0,就说 ...

  6. vijos 1053 Easy sssp

    描述 输入数据给出一个有N(2 <= N <= 1,000)个节点,M(M <= 100,000)条边的带权有向图. 要求你写一个程序, 判断这个有向图中是否存在负权回路. 如果从一 ...

  7. Easy sssp(vijos 1053)

    描述 输入数据给出一个有N(2 <= N <= 1,000)个节点,M(M <= 100,000)条边的带权有向图. 要求你写一个程序, 判断这个有向图中是否存在负权回路. 如果从一 ...

  8. Vijos——T1053 Easy sssp

    https://vijos.org/p/1053 描述 输入数据给出一个有N(2 <= N <= 1,000)个节点,M(M <= 100,000)条边的带权有向图. 要求你写一个程 ...

  9. Easy sssp(spfa判负环与求最短路)

    #include<bits/stdc++.h> using namespace std; int n,m,s; struct node{ int to,next,w; }e[]; bool ...

随机推荐

  1. 通过css控制超链接不显示下划线

    “页面属性”——“链接”——“下划线样式”——“始终无下划线” <style type="text/css"> a:link { text-decoration: no ...

  2. webStrom2017.1版本如何添加vue.js插件

    第一步:打开webStrom-setting 第二步:选择File and Code Templates--点击左上角"+"号 第三步:在Name:vue File    Exte ...

  3. 九度OJ 1010 A +B

    #include <iostream> #include <string> #include <sstream> using namespace std; int ...

  4. [我所理解的REST] 3.基于网络应用的架构

    上篇中解释到什么是架构风格和应该以怎样的视角来理解REST(Web的架构风格).本篇来介绍一组自洽的术语,用它来描述和解释软件架构:以及列举下对于基于网络的应用来说,哪些点是需要我们重点关注的. 1 ...

  5. 第二次项目冲刺(Beta阶段)5.23

    1.提供当天站立式会议照片一张 会议内容: ①检查前一天的任务情况,将遇到的瓶颈反馈,看看团队成员是否有好的建议. ②制定新一轮的任务计划. 2.每个人的工作 (1)工作安排 队员 今日进展 明日安排 ...

  6. 201521123010 《Java程序设计》第2周学习总结

    1. 本周学习总结 这周学习了在JAVA里各种数据类型的使用.各种运算符的使用.表达是的使用,还初步学习了枚举的用法,也掌握了一些枚举和switch语句结合的用法,还了解了一些字符串类.在实验课上也学 ...

  7. Myeclipse设置文件编码

    设置选项分析: 1.window-->preferences-->General-->workspace-->Text file encoding 这里设置全局默认的文件编码格 ...

  8. 201521123065《java程序设计》第9周学习总结

    1. 本周学习总结 2. 书面作业 本次PTA作业题集异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? 出现的异 ...

  9. 06jQuery-05-事件

    不同的浏览器绑定事件的代码都不太一样,所以我们使用jQuery来写代码的话,可以屏蔽不同浏览器之间的差异. 在jQuery中,可以使用 on 来绑定一个事件,指定事件的名称和对应的处理函数: // 获 ...

  10. 鸟哥Linux学习笔记05

    1,          文件系统通常会将 权限与属性放置到inode中,至于实际数据则放置到data block块中.另外还有一个超级块(superblock)会记录整个文件系统的整体内容,包括ino ...