Easy sssp(vijos 1053)
2024-09-01 15:51:05
描述
输入数据给出一个有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的最短路的长度.
样例1
限制
Test5 5秒
其余 1秒
/*
一个水题,水了一下午了才水过去,陷阱太多了
这不是普通的spfa的模板,因为有些点可能起点没有连通,但是却构成了环,应该输出-1,
却输出了一堆 NoPath,所以应该设一个inp数组,记录某个点有没有出现过,然后把所有
没有出现过的点再spfa一遍。
*/
#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#define N 1010
#define M 100010
#define INF 10000000
#define LL long long
using namespace std;
int head[N],vis[N],num[N],inp[N],n,m,flag;
LL dis[N],dis1[N];
struct node
{
int v,pre,t;
};node e[M];
queue<int> q;
int read()
{
char c=getchar();int num=,flag=;
while(c<''||c>''){if(c=='-')flag=-;c=getchar();}
while(c>=''&&c<=''){num=num*+c-'';c=getchar();}
return num*flag;
}
void add(int cnt,int x,int y,int z)
{
e[cnt].v=y;
e[cnt].t=z;
e[cnt].pre=head[x];
head[x]=cnt;
}
void spfa(int s,LL d[])
{
while(!q.empty())q.pop();
vis[s]=;
inp[s]=;
q.push(s);
d[s]=;
while(!q.empty())
{
int x=q.front();
q.pop();
vis[x]=;
for(int i=head[x];i;i=e[i].pre)
{
int y=e[i].v;
if(d[y]>d[x]+(LL)e[i].t)
{
d[y]=d[x]+(LL)e[i].t;
if(!vis[y])
{
inp[y]=;
vis[y]=;
num[y]++;
q.push(y);
if(num[y]>=n||d[s]<)
{
flag=;
return;
}
}
}
}
}
}
int main()
{
n=read();m=read();int s=read();
for(int i=;i<=n;i++)dis[i]=INF;
for(int i=;i<=m;i++)
{
int x=read(),y=read(),z=read();
add(i,x,y,z);
}
spfa(s,dis);
for(int i=;i<=n;i++)
if(!inp[i])
{
if(flag){printf("-1");return ;}
spfa(i,dis1);
}
if(flag){printf("-1");return ;}
for(int i=;i<=n;i++)
if(dis[i]<dis[])cout<<dis[i]<<endl;
else printf("NoPath\n");
return ;
}
最新文章
- SubVersion Ubuntu
- 第3天作业 PoEdu MyString实现
- 9.5---括号是否有效(CC150)
- js/jquery 实时监听输入框值变化的完美方案:oninput &; onpropertychange
- javascript宿主对象之window.navigator
- Word Ladder 未完成
- DNS劫持 DNS污染
- 使用firefoxprofile,selenium设置firefox,初始化firefox
- 第四种:GCD
- vue.js基础知识篇(1):简介、数据绑定
- @Autowired注解在抽象类中实效的原因分析
- 《Head First 设计模式》【PDF】下载
- BZOJ 1758: [Wc2010]重建计划 [暂时放弃]
- 从VGA到GPU!细数二十年显卡发展历程
- IDEA+Tomcat+Maven+SpringMVC基于Java注解配置web工程
- [删括号][判断可行性的dp]
- OpenOCD-JTAG调试
- robotframework&#183;WEB端基础
- codevs 1380 没有上司的舞会 - 树形动态规划
- Oracle性能问题sql调优脚本集
热门文章
- 【学习笔记】比特(bit)、字,字节(B)存储单位之间的关系+其与操作系统位数的关系+不同编译器编译方式下数据类型的表示范围
- iOS 二维码的生成 QREncoder
- Nagios的服务器监控
- Oracle的数据伪列(ROWNUM)
- git设置log的别名 for hist
- Javaweb学习笔记4—Reuest&Response
- Java String startsWith()方法
- gulp自动化构建工具使用
- 年度精品 XP,32/64位Win7,32/64位Win10系统【电脑城版】
- RPC(Remote Procedure Call Protocol)远程过程调用协议