UVA11090 Going in Cycle!! 【SPFA】

题意:求一个无向图的边权平均值最小的环

思路:假设环中Σwi/t<ans 那变形一下就是Σwi<ans*t → Σ(wi-ans)< 0 这样就可以二分答案做了

#include <stdio.h>

#include <iostream>

#include<queue>

#include <string.h>

#include <algorithm>

#define maxn 90000

#define esp 0.00000001

using namespace std;

int head[maxn],point[maxn],next[maxn],value[maxn];

int now,n,m,x,y,v,inque[maxn];

double dist[maxn];

void add(int x,int y,int v)

{

next[++now]=head[x];

head[x]=now;

point[now]=y;

value[now]=v;

}

int spfa(int s,double x)

{

for(int i=1;i<=n;i++)dist[i]=0x3f3f3f3f;

memset(inque,0,sizeof(inque));

int visit[maxn]={0};

queue<int>q;

q.push(s);

visit[s]=1;

dist[s]=0;

while(!q.empty())

{

int u=q.front();

q.pop();

visit[u]=0;

for(int i=head[u];i;i=next[i])

{

int k=point[i];

if(double(dist[u]+1.0*value[i]-x)<dist[k])

{

dist[k]=(double)dist[u]+1.0*value[i]-x;

if(visit[k]==0)

{

visit[k]=1;

inque[k]++;

if(inque[k]>n)return 1;

q.push(k);

}

}

}

}

return 0;

}

int main()

{

int t,cas=1,flag=0;

scanf("%d",&t);

while(t--)

{

now=0;

memset(head,0,sizeof(head));

scanf("%d%d",&n,&m);

double l=0,r=0;

for(int i=1;i<=m;i++)

{

scanf("%d%d%d",&x,&y,&v);

add(x,y,v);

if(v>r)r=v;

}

printf("Case #%d: ",cas++);

for(int i=1;i<=n;i++)

{

add(n+1,i,0);

}

if(spfa(n+1,r+100)==0){printf("No cycle found.\n");continue;}

while(r-l>esp)

{

double mid=(l+r)/2;

if(spfa(n+1,mid)==1){r=mid;flag=1;}else l=mid;

}

//    cout<<spfa(n+1,2.5)<<endl;

printf("%.2f\n",r);

}

return 0;

}

时间: 2024-11-06 08:31:02

UVA11090 Going in Cycle!! 【SPFA】的相关文章

HDU1224 Free DIY Tour 【SPFA】

Free DIY Tour Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3939    Accepted Submission(s): 1262 Problem Description Weiwei is a software engineer of ShiningSoft. He has just excellently fulf

uva11090 Going in Cycle!! --- 二分+spfa判负环

给一个带权有向图,求其中是否存在环,若存在,输出环上边权的平均值最小的那个的平均值. 点的范围就50,感觉可以很暴力..但显然超时了 感觉方法好巧妙,二分平均值,将所有边权减去二分的那个值,然后spfa判断是否有负环 若有负环,则图中存在的所有环的边权平均值一定比枚举值大 反之则小,要是无论枚举值多大都没有负环,说明图中没有环. #include <iostream> #include <cstring> #include <string> #include <c

boj 454 帮帮小叮当【SPFA】

题目链接:http://code.bupt.edu.cn/problem/p/454/ 454. 帮帮小叮当 时间限制5000 ms 内存限制 65536 KB 题目描述 小叮当刚刚学会了传送门的使用方法,可是它不小心跌落到二维空间一个 n * m 的矩阵格子世界的入口(1,1)处, 他得知出口在(n,m)处,每穿越一个格子门,它的体力值会下降. 又饿又累的他 IQ 已经降为负数了,聪明的你,能帮他规划一下路线,使得它体力值下降的最少吗? 每一行有且仅有一个传送门,但是小叮当上课睡着了,只学会了

HDU1142 A Walk Through the Forest 【SPFA】+【记忆化搜索】

A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5688    Accepted Submission(s): 2089 Problem Description Jimmy experiences a lot of stress at work these days, especial

POJ 2449 Remmarguts&#39; Date【SPFA】【A*】

Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 21978 Accepted: 5982 Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, he to

HDU1217 Arbitrage 【SPFA】

Arbitrage Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4460    Accepted Submission(s): 2032 Problem Description Arbitrage is the use of discrepancies in currency exchange rates to transform

POJ2253&amp;ZOJ1942--Frogger【SPFA】单源最短路变形

链接:http://poj.org/problem?id=2253 题意:一个青蛙在一块石头上,看到了另一个青蛙在另一块石头上,它想跳过去找它,如果距离太远它就需要借助别的石头当跳板,两块石头之间的青蛙距离被定义成两块石头之间所有路径中最大跳跃距离的最小值,求两个青蛙之间的青蛙距离. poj2263和它类似,链接:http://poj.org/problem?id=2263 解题报告:Here 这是最短路的变形,每两点之间都有路可以跳,更新最短路的值,权值记录成目前到这一点的最小青蛙距离就行了

HDU3339 In Action 【SPFA】+【01背包】

In Action Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4099    Accepted Submission(s): 1306 Problem Description Since 1945, when the first nuclear bomb was exploded by the Manhattan Project

【SPFA】POJ1860-Currency Exchange

[题目大意] 给出每两种货币之间交换的手续费和汇率,求出从当前货币s开始交换,能否赚. [思路] 反向运用SPFA,判断是否有正环.每次队首元素出队之后,判断一下到源点s的距离是否增大,增大则返回true.一开始判断正环的思路如果有一个元素入队超过n次,则说明存在正环.后来发现这个思路是不适用的,因为这个正环中并不一定包含源点..要注意的是:题目中的m并不是边数,边数应该是m*2!所以开数组的时候要尤其注意数组不能开小了.由于C++的判定中如果没有崩掉,不会返回RE只会返回WA,我纠结了好久才找