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. 在Intellij IDEA中使用Debug

    Debug用来追踪代码的运行流程,通常在程序运行过程中出现异常,启用Debug模式可以分析定位异常发生的位置,以及在运行过程中参数的变化.通常我们也可以启用Debug模式来跟踪代码的运行流程去学习三方 ...

  2. github+hexo搭建自己的博客网站(六)进阶配置(搜索引擎收录,优化你的url)

    详细的可以查看hexo博客的演示:https://saucxs.github.io/ 绑定了域名: http://www.chengxinsong.cn hexo+github博客网站源码(可以clo ...

  3. LVS之-LAMP搭建wordpress

    author:JevonWei 版权声明:原创作品 LVS搭建wordpress,涉及的知识点有DNS,LAMP,NFS及LVS 网络拓扑图 网络环境 NFS 192.168.198.130 mysq ...

  4. js文件引用方式及其同步执行与异步执行

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp74   任何以appendChild(scriptNode) 的方式引入 ...

  5. sqlserver自定义函数

    标量函数 RETURNS 子句指定一种标量数据类型,则函数为标量值函数. 语法 Create function 函数名(参数) Returns 返回值数据类型 [with {Encryption | ...

  6. 基于NIOS-II的示波器:PART4 系统调试&测试

    本文记录了在NIOS II上实现示波器的第四部分. 本文主要包括:修改部分BUG,以及测试 本文所有的硬件以及工程参考来自魏坤示波仪,重新实现驱动并重构工程. version 1.0 界面修改& ...

  7. ueditor ie8兼容性问题

    ie8情况下,在进入加载有uEditor编辑器页面时候,不显示工具栏,会提示ueditor 缺少对象或者出现错误   1.引用Ueditor的js 的时候用 绝对路径       网上搜出来的一种解决 ...

  8. 十类经典office实用技巧

    IT工程师不得不会的职场office软件(不是金山WPS),其中ppt最重要也最难学的.之前已经另作文分享,本文是word与excel的十个隐藏技能.一.Excel表格计算公式1.求所有数值和:SUM ...

  9. centos6 内核优化

     以下为部分优化参数,具体优化方法还要看情况而定 [root@localhost ~]# vi /etc/sysctl.conf    #末尾添加如下参数 net.ipv4.tcp_syncookie ...

  10. 集美大学网络1413第九次作业成绩(团队五) -- 测试与发布(Alpha版本)

    NO.NE团队的项目链接有效,六个核桃和六指神功团队可以请教下他们,避免因IP地址无效或者因tomcat不打开就不能访问的情况,毕竟助教没办法知道此时此刻它是开着还是关闭啊啊啊... 题目 团队作业5 ...