zoj 3792 Romantic Value(最小割)
来源:互联网 发布:经典的c语言源代码网站 编辑:程序博客网 时间:2024/05/29 19:20
题意:给出点数为n的图,删掉一些边使得从1到n不连通,在删掉的边权最小的前提下令删掉的边尽可能小,然后求个奇怪的比值。
思路:不看第二个条件就是个裸的最小割,带上这个条件也没差太多,对于条边,附加一点边的信息,对于一条边权为w的边,建立容量为10000*w+1的弧,最后求出最大流后,MaxFlow/10000就是最小花费,MaxFlow%10000就是删除的边数。
代码:
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<map>#include<queue>#include<stack>#include<cmath>#include<vector>#include<bitset>#define inf 0x3f3f3f3f#define Inf 0x3FFFFFFFFFFFFFFFLL#define eps 1e-6#define pi acos(-1.0)using namespace std;typedef long long ll;const int maxn=55;const int maxm=10000+10;struct Edge{ int to,cap,next; Edge(){} Edge(int to,int cap,int next):to(to),cap(cap),next(next){}}edges[maxm<<1];int head[maxn],d[maxn],nEdge;void AddEdges(int from,int to,int cap){ edges[++nEdge]=Edge(to,cap,head[from]); head[from]=nEdge; edges[++nEdge]=Edge(from,0,head[to]); head[to]=nEdge;}bool BFS(int s,int t){ memset(d,0xff,sizeof(d)); queue<int>q; q.push(s); d[s]=0; while(!q.empty()) { int u=q.front();q.pop(); for(int k=head[u];k!=-1;k=edges[k].next) { Edge e=edges[k]; if(d[e.to]==-1&&e.cap) { d[e.to]=d[u]+1; q.push(e.to); } } } return d[t]!=-1;}int DFS(int u,int a,int t){ if(u==t||a==0) return a; int flow=0,f; for(int k=head[u];k!=-1;k=edges[k].next) { Edge e=edges[k]; if(d[e.to]==d[u]+1&&(f=DFS(e.to,min(a,e.cap),t))>0) { edges[k].cap-=f; edges[k^1].cap+=f; flow+=f;a-=f; if(a==0) return flow; } } d[u]=-1; return flow;}int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int T; int n,m,s,t; scanf("%d",&T); while(T--) { scanf("%d%d%d%d",&n,&m,&s,&t); memset(head,0xff,sizeof(head)); nEdge=-1; int u,v,w; int sum=0; for(int i=0;i<m;++i) { scanf("%d%d%d",&u,&v,&w); AddEdges(u,v,w*10000+1); AddEdges(v,u,w*10000+1); sum+=w; } int flow=0; while(BFS(s,t)) flow+=DFS(s,inf,t); if(flow==0) puts("Inf"); else { int ans=flow/10000; int ans2=flow%10000; double res=(double)(sum-ans)/ans2; printf("%.2lf\n",res); } } return 0;}
0 0
- zoj 3792 Romantic Value(最小割)
- zoj 3792 Romantic Value(最小割下边数最小)
- ZOJ 3792 Romantic Value 最小割
- ZOJ 3792 Romantic Value 最小割
- ZOJ 3792 Romantic Value(最小割问题)
- ZOJ 3792 Romantic Value(ISAP && 最小割)
- zoj-3792-Romantic Value-最小割+数值转化
- zoj 3792 最小割等于最大流 Romantic Value
- ZOJ 3792 Romantic Value 最小割+求割边的数量
- ZOJ 3792 - Romantic Value (网络流‘最小割)
- ZOJ 3792 Romantic Value(网络流之最小割)(找割边)
- ZOJ 3792 Romantic Value 最小割(最小费用下最小边数)
- zoj3792 Romantic Value 最大流<->最小割
- zoj3792--Romantic Value(最大流+最小割,求解割边)
- zoj 3792 最小割
- ZOJ 3792 最小割+求割边
- zoj 2788 Panic Room (最小割)
- zoj 2788 Panic Room(最小割)
- Linux jrtplib编译错误解决
- Object-C语言中的block
- C++调用Lua教程
- VS2010中添加Flash控件
- 椭圆轮廓识别
- zoj 3792 Romantic Value(最小割)
- 【学习经验】强者不是没有眼泪,而是含着眼泪依然奔跑。
- 归并排序
- jQuery源码学习笔记:总体架构
- C#类似windows资源管理器-获取文件图标
- Uboot 启动参数说明:
- 飞鸽传书 如用用正则表达式排除某个字符
- 一个收集机器学习各个领域的surveys,tutorials 的网站
- Uboot启动参数说明