Codevs1992题解
题目大意
求有向图中经过某一点k的最大环(数据规模不支持floyd)。题解
以k为起点在正向图中spfa求单源最短路。再在反向图中spfa求单源最短路。枚举除k外的每个点i。假设有一个同一时候包括i与k的环。ans=max{ans,dist[i]+invdist[i]}。
Code
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn = 1010, maxm = 200010, nil = 0, oo = 1061109567;
int n, m, k;
int pnt[maxn], nxt[maxm], u[maxm], v[maxm], w[maxm], e;
int d[maxn], invd[maxn];
bool vis[maxn], other[maxm];
void addedge(int x, int y, int z)
{
u[++e] = x; v[e] = y; w[e] = z;
nxt[e] = pnt[x]; pnt[x] = e; other[e] = false;
u[++e] = y; v[e] = x; w[e] = z;
nxt[e] = pnt[y]; pnt[y] = e; other[e] = true;
}
void init()
{
int x, y, z;
scanf("%d%d%d", &n, &m, &k);
for(int i = 1; i <= m; ++i)
{
scanf("%d%d%d", &x, &y, &z);
addedge(x, y, z);
}
}
void work()
{
queue <int> q;
//下面为反向spfa
memset(invd, 0x3f, sizeof(invd));
memset(vis, 0, sizeof(vis));
invd[k] = 0; vis[k] = true;
q.push(k);
while(!q.empty())
{
int tmp = q.front();
q.pop();
vis[tmp] = false;
for(int j = pnt[tmp]; j != nil; j = nxt[j])
{
if(other[j] && invd[v[j]] > invd[tmp] + w[j])
{
invd[v[j]] = invd[tmp] + w[j];
vis[v[j]] = true;
q.push(v[j]);
}
}
}
//下面为正向spfa
memset(d, 0x3f, sizeof(d));
memset(vis, 0, sizeof(vis));
d[k] = 0; vis[k] = true;
q.push(k);
while(!q.empty())
{
int tmp = q.front();
q.pop();
vis[tmp] = false;
for(int j = pnt[tmp]; j != nil; j = nxt[j])
{
if((!other[j]) && d[v[j]] > d[tmp] + w[j])
{
d[v[j]] = d[tmp] + w[j];
vis[v[j]] = true;
q.push(v[j]);
}
}
}
int ans = 0;
for(int i = 1; i <= n; ++i)
{
if(d[i] != oo && invd[i] != oo)
{
ans = max(ans, d[i] + invd[i]);
}
}
printf("%d\n", ans);
}
int main()
{
init();
work();
return 0;
}
Codevs1992题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- Android防止内存泄漏以及MAT的使用
Android发生内存泄漏最普遍的一种情况就是长期保持对Context,特别是Activity的引用,使得Activity无法被销毁.这也就意味着Activity中所有的成员变量也没办法销毁.本文仅介 ...
- sql service重置自动增长字段数字的方法
1.--SQL表重置自增长字段(不删除表的数据) DBCC CHECKIDENT('表名', RESEED, 起始数) 2.--删除表数据的同时,重置自动增长字段 truncate table 表名
- 伪元素first-letter(首字母变大)
让首字母变大 <p>Do you like to ride a bicycle?</p> p:first-letter{ font-size: 34px; }
- JavaScript-------寄生组合式继承
组合继承在前面有说过,也是JavaScript中最常用的一个继承模式:不过,它也有自己的不足.组合继承最大的问题就是无论什么情况,都会调用两次构造函数: 那我们来回顾下组合式继承基本模式: funct ...
- Git应用于Android项目的入门知识:我的理解
Git应用于Android项目的基本知识. 常常将git,repo和gerrit三种工具配合起来使用,使Android开发中的部分工作自动化.并适应敏捷项目管理的需要. repo是Go ...
- 文摘:威胁建模(STRIDE方法)
文摘,原文地址:https://msdn.microsoft.com/zh-cn/magazine/cc163519.aspx 威胁建模的本质:尽管通常我们无法证明给定的设计是安全的,但我们可以从自己 ...
- hadoop启动守护进程报JAVA_HOME is not set and could not be found
hadoop启动守护进程 sbin/start-dfs.sh 报如下错误:JAVA_HOME is not set and could not be found 解决办法(JAVA_HOME修改为具体 ...
- 软件测试作业三 尝试使用JUnit
写一个判断三角形种类的代码,对其进行测试. 判断三角形代码: package 测试1; public class sjx { public String f(int a,int b,int c) { ...
- C++服务器设计(零):总体设计
这个系列把毕业论文的部分贴了出来,以作保存留念.整个系列分为三大部分,其中第一章到第三章是介绍服务器的系统层设计,设计思路参考了libevent和muduo等开源代码的实现:第四章到第六章是介绍服务器 ...
- Shell glob
在Linux中,glob是用来匹配路径名的通配符,glob主要包含以下4种: Wildcard Matching * 匹配0个或者多个字符,比如d*,可以匹配d, d1, dd1 ?匹配单个字符,比如 ...