hdu 3987 最小割边数模板题
来源:互联网 发布:重生小说改编的网络剧 编辑:程序博客网 时间:2024/06/01 23:40
题目:http://acm.split.hdu.edu.cn/showproblem.php?pid=3987
题意:n个数,m行。给出一张有n个点的图,1表示有向,0表示无向,现在要你破坏一些路,使得从点0无法到达点n-1。破坏每条路都有一个代价。求在代价最小的前提下,最少需要破坏多少条道路。(就是说求在最小割的前提下,最小的割边数)
求最小割割的边数:
跑一边最大流,满流的记为1,未满的记为inf,再跑一遍最大流,n个1就是边数了。
/*Dinic的判断是边上的flow加到cap,而不是减到0.下标从哪开始都行。*/#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<queue>#include<iostream>#define mem(a,x) memset(a,x,sizeof(a))using namespace std;const int inf = 0x3f3f3f3f;const int maxn = 50 + 5;const int maxs = maxn*maxn + 5;int n,m;struct Edge{ int from,to,cap,flow;};struct Dicnic{ int n,m,s,t; int d[maxs],cur[maxs],vis[maxs]; vector<int>G[maxs]; vector<Edge>edges; void AddEdge(int from,int to,int cap){ Edge e1 = {from,to,cap,0}; Edge e2 = {to,from,0,0}; edges.push_back(e1); edges.push_back(e2); int m = edges.size(); G[from].push_back(m-2); G[to].push_back(m-1); } void init(int n){ this -> n = n; for(int i = 0;i<=n;i++){ G[i].clear(); } edges.clear(); } bool BFS(){ //就是用BFS分了个层而已,一看代码便知 mem(vis,0); queue<int>Q; Q.push(s); vis[s] = 1; d[s] = 0; while(!Q.empty()){ int x = Q.front(); Q.pop(); for(int i=0;i<G[x].size();i++){ Edge &e = edges[G[x][i]]; if(!vis[e.to]&&e.cap>e.flow){ vis[e.to] = 1; d[e.to] = d[x] + 1; Q.push(e.to); } } } return vis[t]; } int DFS(int x ,int a){ //就是顺着层次dfs而已 if(x==t||a==0) return a; int flow = 0 , f; for(int &i = cur[x];i<G[x].size();i++){ Edge &e = edges[G[x][i]]; if(d[e.to]==d[x]+1&&(f = DFS(e.to,min(a,e.cap-e.flow)))>0){ //a是路径上的最小残存容量 e.flow += f; edges[G[x][i]^1].flow -= f; //反向边 flow += f; a -= f; if(a==0) break; //a等于0及时退出,再从s那找一遍,因为从哪断的不知道 } } return flow; } int MaxFlow(int s,int t){ this -> s = s; this ->t = t; int flow = 0; while(BFS()){ mem(cur,0); flow += DFS(s,inf); } return flow; } void build2(){ for(int i=0;i<edges.size();i+=2){ Edge &e=edges[i]; if(e.flow==e.cap){ e.cap=1; edges[i^1].cap=0; } else{ e.cap=inf; edges[i^1].cap=0; } e.flow=0; edges[i^1].flow=0; } }}g;int main(){ int t,cases=1; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); g.init(n); int a,b,c,d; for(int i=1;i<=m;i++){ scanf("%d%d%d%d",&a,&b,&c,&d); g.AddEdge(a,b,c); if(d) g.AddEdge(b,a,c); } g.MaxFlow(0,n-1); g.build2(); printf("Case %d: %d\n",cases++,g.MaxFlow(0,n-1)); } return 0;}
阅读全文
0 0
- hdu 3987 最小割边数模板题
- 【HDU】3452 Bonsai 最小割模板题
- hdu 3002 全局最小割模板题
- HDU上一道最小生成树模板题的练习
- Constructing Roads+最小生成树模板题+hdu
- hdu 1863 畅通工程-----------最小生成树模板题
- HDU 1863 畅通工程(最小生成树模板题)
- HDU 3374 String Problem(最大最小表示法 模板题)
- hdu 1102 Constructing Roads 最小生成树prim模板题
- hdu 1102 最小生成树prim模板题
- HDU 1301 Jungle Roads (最小生成树/模板题)
- hdu 1533 最小费用最大流模板题
- hdu 3691 全局最小割模板题 + 一点学习记录
- HDU-1879 最小生成树(Kruskal)模板题
- 模板:最小割边数
- 最小割集 hdu 3002 ( 模板)
- HDU 3488 最小费用最大流模板
- hdu-5251(矩形最小覆盖模板)
- 回溯算法(N皇后)--C#版代码
- Tomcat Can't load AMD 64-bit .dll on a IA 32
- 处理机管理
- 第15篇
- weblogic 使用总结
- hdu 3987 最小割边数模板题
- 1.再次学C语言
- 属性动画
- byte类型数据的取值范围及溢出后的强制转换及在内存中的存储结果
- python scrapy爬虫 CrawlSpider 拉钩招聘网302重定向问题解决方案 , 修改setting信息,添加cookie请求
- mysql入门之sql分类
- No space in execution regions with .ANY selec错误的解决
- 数据流处理器类
- 算法之堆排序