J - 【黄色】这题真的是模板题 (Gym - 102072J )(spfa)
在看完其他出题人出的毒瘤题之后,良心出题人终于看不下去了,决定出一道模板题来送给大家一个AC,那么,你们能不能接住这个送来的AC呢?
给出一个$$$n$$$个结点$$$m$$$条边的带权有向图,若图中存在负权回路直接输出"-1",否则输出点$$$s$$$到每个点的最短路的长度,如果$$$s$$$点不连通,输出"NoPath"。
Input
第一行输入三个值$$$n,m,s(2 \leq n \leq 1000,m\leq 10^5,1\leq s \leq N)$$$
接下来m行,每行三个整数$$$u,v,w$$$表示$$$u$$$和$$$v$$$之间有一条权值为$$$w$$$的有向边$$$(1<=u,v,s=N,-10^6<=w<=10^6)$$$。
Output
如果存在负权环,输出"-1"
否则输出$$$n$$$行,分别表示$$$s$$$点到$$$i$$$点的最短路,如果$$$s=i$$$输出0。
Example
Input
6 7 1
1 2 6
1 3 4
2 4 5
3 5 4
3 6 3
4 5 1
6 4 2
Output
0
6
4
9
8
7
spfa(算法)
#include <iostream>
#include <bits/stdc++.h>
#include <string.h>
#include <math.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int N = 1e5+5;
const ll inf = 0x3f3f3f3f3f3f3f3f;
int n,cnt;
int cntt[N],head[N];
ll dis[N],dis1[N];
bool vis[N];
struct Edge
{int to,w,ne;//Edge() {}//Edge(int to,int w,int ne)://to(to),w(w),ne(ne) {}
} e[N];
int ans[N],an[N];void add(int u,int v,int w)
{e[cnt].to = v;e[cnt].w = w;e[cnt].ne = head[u];head[u] = cnt++;
}bool spfa(int s,ll *dis)
{dis[s]=0;vis[s]=1;int v;queue<int>q;q.push(s);while(!q.empty()){v=q.front();q.pop();vis[v]=0;for(int i=head[v]; i!=-1; i=e[i].ne){if(dis[e[i].to]>dis[v]+e[i].w){dis[e[i].to] = dis[v]+e[i].w;if(vis[e[i].to]==0){cntt[e[i].to]++;vis[e[i].to]=1;q.push(e[i].to);if(cntt[e[i].to] >= n){return true;}}}}}return false;
}void init()
{cnt = 0;mem(vis,0);mem(e,0);mem(dis,inf);mem(cntt,0);mem(head,-1);mem(ans,0);
}int main()
{int m,s;while(cin >> n >> m >> s){init();for(int i = 1; i<=m; i++){int u,v,w;cin >> u >> v >> w;add(u,v,w);}bool ok = spfa(s,dis);int tot = 0;if(!ok){for(int i = 1; i <= n; i++){if(i == s){continue;}if(dis[i] == inf){ans[tot++] = i;}}if(tot == n-1){cout << "NoPath" << endl;}else{bool f = false;for(int i = 0; i < tot; i++){f=spfa(ans[i],dis1);if(f){cout << "-1" << endl;break;}}if(f == false){for(int i = 1; i <= n; i++){if(dis[i] == inf){cout << "NoPath" << endl;}else{cout << dis[i] << endl;}}}}}else{cout << "-1" << endl;}}return 0;
}
J - 【黄色】这题真的是模板题 (Gym - 102072J )(spfa)相关推荐
- 在线题库html模板,题库分类.html
题库分类 $axure.utils.getTransparentGifPath = function() { return 'resources/images/transparent.gif'; ...
- CSP认证 201503-3 节日[C++题解]:模拟、枚举、日期题、日期模板题
题目分析 来源:acwing 分析: 每月有多少天用数组months[]来存储,下标是1 ~ 12,二月存的是平年28天.另外,星期1到星期日的下标是0~6,起点1850 年 1 月 1 日是星期二, ...
- CSP认证201509-4 高速公路[C++题解]:强连通分量、tarjan算法模板题
题目分析 来源:acwing 分析: 所求即为强连通分量的个数,然后计算每个强连通分量中点的个数,相加即可. 所谓强连通分量,它是一个子图,其中任意两点可以相互到达,并且再加一个点,就不能满足任意两点 ...
- 小雨的矩阵(DFS三参数模板题)
E-小雨的矩阵 题目描述 小雨有一个n×n 的矩阵,起点在(1,1),终点在(n,n),只能向下或向右走,且每次只能走 1 步. 矩阵上每个点都有一个点权a(i,j). 求走到终点的路径有多少不同的点 ...
- 牛客小白月赛12 J 月月查华华的手机 (序列自动机模板题)
链接:https://ac.nowcoder.com/acm/contest/392/J 来源:牛客网 题目描述 月月和华华一起去吃饭了.期间华华有事出去了一会儿,没有带手机.月月出于人类最单纯的好奇 ...
- J.哭泣的阿木木(线段树模板题)
哭泣的阿木木 Description 没啥用的背景故事: 在远古的恕瑞玛,有一个孤独而又忧郁的灵魂,阿木木.他在世间游荡,只为找到一个朋友.他遭受了一种远古的巫术诅咒,注定忍受永世的孤单,因为被他触碰 ...
- HDU1166 敌兵布阵(树状数组模板题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- 动态规划dp(带模板题の超易懂版):01背包,完全背包,分组背包,多重背包,混合背包
动态规划dp(带模板题の超易懂版):01背包,完全背包,分组背包,多重背包 01背包 && 完全背包 && 分组背包 の 视频教程:https://www.bilibi ...
- 匈牙利算法——最大匹配问题详解(附模板题)
基本概念转自 https://blog.csdn.net/dengheCSDN/article/details/77619308 匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名. ...
最新文章
- D - Fliptile POJ - 3279(翻转问题)
- 京东ajax怎么用,使用Ajax、json实现京东购物车结算界面的数据交互实例
- 【Nginx那些事】nginx配置实例(三)动静分离
- python template engine
- node获取图片路径_Deno 正式发布,彻底弄明白和 node 的区别
- Python爬取豆瓣网中即将上映的电影数据清单
- C#扩展名关联【转】
- VB代码 VB小程序
- matlab求函数在区间内最大值与最小值
- AndroidImageSlider三分钟快速集成酷炫自动轮播广告
- Linux日期计算器,【C++】日期类+日期万年历+日期计算器
- 你想学习吗?你会学习吗?你知道该如何学习吗?学习之道-读书笔记
- Qt下使用vs编译的库文件
- 医疗器械注册文件清单 2022.5.26
- PreScan快速入门到精通第三十四讲基于PreScan进行超声波雷达传感器仿真
- 【DBC】DBC文件格式详解
- BGA焊点气泡的分布与原因
- 人工神经网络的训练步骤,人工神经网络建模步骤
- 华数工业机器人教学视频_华数六轴工业机器人技术知识讲解介绍
- 软件测试技术(七)自动化测试