UVA11090 Going in Cycle (二分+判负环)
二分法+spfa判负环。如果存在一个环sum(wi)<k*x,i=0,1,2...,k,那么每条边减去x以后会形成负环。因此可用spfa来判负环。
一般spfa判负环dfs最快,用stack次之,queue最慢,因为一个负环中被更新的点是连续的。
一开始不知到图的连通情况,所以把所有点都入栈更新。
#include<bits/stdc++.h>
using namespace std;
const int maxn = ; struct Edge
{
int v,nxt;
double w;
};
vector<Edge> edges;
int head[maxn];
#define PB push_back
void addEdge(int u,int v,double w)
{
edges.PB({v,head[u],w});
head[u] = edges.size()-;
} bool vis[maxn];
double d[maxn];
int cnt[maxn]; bool spfa(int n)
{
stack<int>S;
memset(vis,,sizeof(vis));
memset(cnt,,sizeof(cnt));
for(int i = ; i < n; i++) { vis[i] = true; d[i] = .; S.push(i); }
while(S.size()){
int u = S.top(); S.pop();
vis[u] = false;
for(int i = head[u]; ~i; i = edges[i].nxt){
Edge &e = edges[i];
if(d[e.v]>d[u]+e.w){
d[e.v] = d[u]+e.w;
if(!vis[e.v]){
S.push(e.v); vis[e.v] = true;
if(++cnt[e.v] > n) return true;
}
}
}
}
return false;
} bool P(double x,int n)
{
for(int i = ; i < (int)edges.size(); i++) edges[i].w -= x;
bool ret = spfa(n);
for(int i = ; i < (int)edges.size(); i++) edges[i].w += x;
return ret;
} void init()
{
memset(head,-,sizeof(head));
edges.clear();
} const double eps = 1e-; int main()
{
//freopen("in.txt","r",stdin);
int T;cin>>T;
int kas = ;
while(T--){
init();
int n,m; scanf("%d%d",&n,&m);
double l = , r = ;
while(m--){
int u,v; double w; scanf("%d%d%lf",&u,&v,&w);
addEdge(u-,v-,w);
r = max(r,w);
}
printf("Case #%d: ",++kas);
if(!P(r+,n)) { puts("No cycle found."); continue; }
for(double mid; r-l>eps; P(mid,n)?r=mid:l=mid) mid = l+(r-l)/;
printf("%.2lf\n",l);
}
return ;
}
dfs+判负环
bool vis[maxn];
double d[maxn];
bool dfs(int u)
{
vis[u] = true;
for(int i = head[u]; ~i ; i = edges[i].nxt){
Edge &e = edges[i];
if(d[e.v] > d[u]+e.w){
d[e.v] = d[u]+e.w;
if(!vis[e.v]){
if(dfs(e.v)) return true;
}else return true;
}
}
vis[u] = false;
return false;
} 调用
for(int u = ; u < n; u++){
if(dfs(u)) { ret = true; break; }
}
UVA11090 Going in Cycle (二分+判负环)的更多相关文章
- 训练指南 UVA - 11090(最短路BellmanFord+ 二分判负环)
layout: post title: 训练指南 UVA - 11090(最短路BellmanFord+ 二分判负环) author: "luowentaoaa" catalog: ...
- UVA11090 Going in Cycle!!(二分判负环)
UVA11090 Going in Cycle!! 二分答案,用spfa判负环. 注意格式:图不一定连通. 复杂度$O(nmlog(maxw-minw))$ #include<iostream& ...
- BZOJ3597 [Scoi2014]方伯伯运椰子 【二分 + 判负环】
题目链接 BZOJ3597 题解 orz一眼过去一点思路都没有 既然是流量网络,就要借鉴网络流的思想了 我们先处理一下那个比值,显然是一个分数规划,我们二分一个\(\lambda = \frac{X ...
- UVA 11090 Going in Cycle!!(二分答案+判负环)
在加权有向图中求平均权值最小的回路. 一上手没有思路,看到“回路”,第一想法就是找连通分量,可又是加权图,没什么好思路,那就转换题意:由求回路权值->判负环,求最小值->常用二分答案. 二 ...
- poj 3621 二分+spfa判负环
http://poj.org/problem?id=3621 求一个环的{点权和}除以{边权和},使得那个环在所有环中{点权和}除以{边权和}最大. 0/1整数划分问题 令在一个环里,点权为v[i], ...
- poj 2049(二分+spfa判负环)
poj 2049(二分+spfa判负环) 给你一堆字符串,若字符串x的后两个字符和y的前两个字符相连,那么x可向y连边.问字符串环的平均最小值是多少.1 ≤ n ≤ 100000,有多组数据. 首先根 ...
- [APIO2017]商旅——分数优化+floyd+SPFA判负环+二分答案
题目链接: [APIO2017]商旅 枚举任意两个点$(s,t)$,求出在$s$买入一个物品并在$t$卖出的最大收益. 新建一条从$s$到$t$的边,边权为最大收益,长度为原图从$s$到$t$的最短路 ...
- Poj(3259),SPFA,判负环
题目链接:http://poj.org/problem?id=3259 Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submis ...
- Poj 3259 Wormholes(spfa判负环)
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 42366 Accepted: 15560 传送门 Descr ...
随机推荐
- 7.10实习培训日志-markdown Git
父模块github地址 一. markdown 1. markdown列表 html是一种发布的格式,markdown是一种书写的格式 区块引用 列表 图片 表格 html 标题 记笔记 写博客 2. ...
- Vue Study [1]: Vue Setup
Description The article for vue.js Setup. Original post link:https://www.cnblogs.com/markjiang7m2/p/ ...
- org.apache.commons.httpclient和org.apache.http.client区别(转)
官网说明: http://hc.apache.org/httpclient-3.x/ Commons HttpClient项目现已结束,不再开发.它已被其HttpClient和HttpCore模块中的 ...
- Unity 5.6 beta版本新特性
http://manew.com/thread-98549-1-1.html 最新发布的beta版改进了编辑器和2D功能,图形性能更佳,加入新的视频播放器,并添加了对Facebook Gameroom ...
- PHP RSA算法 HMAC-SHA1加密算法
HMAC-SHA1加密算法 function getSignature($str, $key) { $signature = ""; if (function_exists('ha ...
- 了解HTTP协议和TCP协议
HTTP(超文本传输协议),互联网上应用最为广泛的一种网络协议.所有的www文件都必须遵守这个标准.HTTP是一个客户端和服务端请求和应答的标准(TCP):客户通过浏览器发起一个到服务器上指定端口的H ...
- 【微信小程序】开发实战 之 「数据缓存API」解析
每个小程序都可以有自己的本地缓存,可以通过 数据缓存的API 实现对本地缓存进行 设置.获取和清理.本地缓存最大为10M.localStorage是永久存储的,但我们不建议将关键信息都放在localS ...
- 使用JSONPath
SONPath是查询JSON对象元素的标准方法.JSONPath使用路径表达式来导航JSON文档中的元素,嵌套元素和数组.有关JSON的更多信息,请参阅JSON简介. 使用JSONPath访问JSON ...
- HDU-1827-Summer Holiday(强连通分量,贪心)
链接:https://vjudge.net/problem/HDU-1827 题意: 听说lcy帮大家预定了新马泰7日游,Wiskey真是高兴的夜不能寐啊,他想着得快点把这消息告诉大家,虽然他手上有所 ...
- Codeforces Round 56-B. Letters Rearranging(思维)
time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...