Easy sssp
题目描述
输入数据给出一个有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
要求(无)
主要思路
一个Spfa模板题,水了一下午了才水过去,陷阱太多了——QAQ 这不是普通的spfa的模板,因为有些点可能起点没有连通,但是却构成了环,应该输出-1, 却输出了一堆 NoPath。
4 3 1
2 3 -1
3 4 -3
4 2 -5
所以应该设一个ioi数组,记录某个点有没有出现过,然后把所有 没有出现过的点再spfa一遍。 最后再spfa一遍,用于储存dis数组。
如果不设ioi数组,循环1到n时spfa,就会RE
非常重要! ! !
所有数据必须用long long 定义 本蒟蒻用int一直RE~~
正无穷
不能用 7f ————! ! !
定义:0x3f
运用(比较) int : 0x3f3f3f3f long long 0x3f3f3f3f3f3f3f3f
————————AC代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
long long n,m,xx,a,b,w,tot,head[maxn],dis[maxn],vis[maxn],cou[maxn],ioi[maxn],flag;
queue<int>q;
struct edge{
int to,next,w;
}e[maxn];
void add(int a,int b,int w){
e[++tot].next=head[a];
e[tot].w=w;
e[tot].to=b;
head[a]=tot;
}
void Spfa(int x){
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
memset(cou,0,sizeof(cou));
dis[x]=0;
q.push(x);
vis[x]=1;
cou[x]=1;
while(!q.empty()){
int tmp=q.front();
q.pop();
vis[tmp]=0;
for(int i=head[tmp];i;i=e[i].next){
if(dis[e[i].to]>dis[tmp]+e[i].w){
dis[e[i].to]=dis[tmp]+e[i].w;
if(!vis[e[i].to]){
q.push(e[i].to);
ioi[e[i].to]=1;
vis[e[i].to]=1;
cou[e[i].to]++; //判负回,入队大于节点数
if(cou[e[i].to]>n){cout<<"-1";exit(0);};
}
}
}
}
}
int main(){
cin>>n>>m>>xx;
for(int i=1;i<=m;i++)cin>>a>>b>>w,add(a,b,w);//add(b,a,w);
for(int i=1;i<=n;i++)
if(!ioi[i])Spfa(i);
Spfa(xx);
for(int i=1;i<=n;i++)
if(dis[i]==0x3f3f3f3f3f3f3f3f)cout<<"NoPath"<<endl;
else cout<<dis[i]<<endl;
//cout<<dis[y];
return 0;
}
——QAQ
本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/18122225
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话