Uvaoj 11248 Frequency Hopping(Dinic求最小割)

题意:1到n节点(节点之间有一定的容量),需要流过C的流量,问是否可以?如果可以输出possible, 否则如果可以扩大任意一条边的容量
可以达到目的,那么输出possible option:接着输出每一条可以达到目的的边(按升序),再否则输出not possible
思路:先求一次最大流,如果流量至少为C,则直接输出possible,否则需要修改的弧一定在最小割里!
接着吧这些弧(最小割里的)的容量设为无穷大,然后在求最大流,看最大流的流量能否满足是C即可,如果满足了,那就把这一条边记录下来

分析:最大流的程序没有必要完全的执行完毕,知道当前的流量>=C那么就可以中止最大流的程序!
还有就是第一次的最大流程序如果没有找到>=C的最大流,那么此时的流量留着,下一次在最小割里扩容的时候,总是接着第一次Dinic的流量
继续寻找....

  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdio>
  4 #include<algorithm>
  5 #include<vector>
  6 #include<queue>
  7 #define N 105
  8 #define INF 2000000005
  9 using namespace std;
 10 
 11 struct EDGE{
 12     int u, v, nt, cap;
 13     bool flag;
 14     bool vis;
 15     EDGE(){}
 16     EDGE(int u, int v, int nt, int cap, bool flag):u(u), v(v), nt(nt), cap(cap), flag(flag){}
 17 };
 18 
 19 struct node{
 20     int x, y;
 21     node(){}
 22     node(int x, int y) : x(x), y(y){}
 23 };
 24 
 25 int pos[10005];
 26 
 27 node ans[10005];
 28 int preCost[20005];
 29 int vis[20005];
 30 int p[20005];
 31 int pcnt;
 32 int cnt;
 33 
 34 vector<EDGE>g;
 35 int first[N];
 36 
 37 int d[N];
 38 int n, e, c;
 39 
 40 void addEdge(int u, int v, int c){
 41     g.push_back(EDGE(u, v, first[u], c, true));
 42     first[u] = g.size() - 1;
 43     g.push_back(EDGE(v, u, first[v], 0, false));
 44     first[v] = g.size() - 1;
 45 }
 46 
 47 bool bfs(){
 48     memset(d, 0, sizeof(d));
 49     d[1] = 1;
 50     queue<int>q;
 51     q.push(1);
 52     while(!q.empty()){
 53         int u = q.front();
 54         q.pop();
 55         for(int i = first[u]; ~i; i = g[i].nt){
 56             int v = g[i].v;
 57             if(!d[v] && g[i].cap > 0){
 58                 d[v] = d[u] + 1;
 59                 q.push(v);
 60             }
 61         }
 62     }
 63     if(d[n] == 0) return false;
 64     return true;
 65 }
 66 
 67 bool cmp(node a, node b){
 68     if(a.x == b.x)
 69          return a.y < b.y;
 70     return a.x < b.x;
 71 }
 72 
 73 int leave;
 74 
 75 int dfs(int u, int totf){
 76     int flow = 0;
 77     if(u ==n || totf==0) return totf;
 78     for(int i = first[u]; ~i; i = g[i].nt){
 79         int v = g[i].v;
 80         if(d[v] == d[u] + 1 && g[i].cap > 0){
 81             int ff  = dfs(v, min(totf-flow, g[i].cap));
 82             if(ff > 0){
 83                 if(!vis[i]){
 84                     p[pcnt++]=i;
 85                     preCost[i] = g[i].cap;
 86                     vis[i] = 1;
 87                 }
 88                 g[i].cap -= ff;
 89 
 90                 if(!vis[i^1]){
 91                     p[pcnt++]=i^1;
 92                     preCost[i^1] = g[i^1].cap;
 93                     vis[i^1] = 1;
 94                 }
 95                 g[i^1].cap += ff;
 96                 flow += ff;
 97                 
 98                 if(flow >= leave){
 99                     flow = leave;
100                     return flow;
101                 }
102 
103                 if(totf == flow) break;
104             }
105             else d[v] = -1;
106         }
107     }
108     return flow;
109 }
110 
111 bool Dinic(){
112     leave = c;
113     while(bfs()){
114         leave -= dfs(1, INF);
115         if(leave == 0) break;
116     }
117     if(leave == 0) return true;
118     return false;
119 }
120  
121 
122 
123 int main(){
124     int cas = 0;
125     while(scanf("%d%d%d", &n, &e, &c)){
126         if(!n) break;
127         memset(first, -1, sizeof(first));
128         g.clear();
129         cnt = 0;
130         while(e--){
131             int x, y, z;
132             scanf("%d%d%d", &x, &y, &z);
133             addEdge(x, y, z);
134         }
135         printf("Case %d: ", ++cas);//这一块差点没有把我气死...居然有一个空格,没有看清楚啊...一直PE.
136      
137         if(n==1){
138             printf("possible\n");
139             continue;
140         }
141 
142         if(Dinic())  printf("possible\n");
143         else{
144             int len = g.size();
145             for(int i=0; i<len; ++i)
146                 if(g[i].cap == 0 && g[i].flag)
147                     pos[cnt++] = i;//得到最小割
148             int cc = leave;//第一次Dinic之后,还剩下多少的流量需要流过
149             int ret = 0;
150             for(int i=0; i<cnt; ++i){
151                 c = cc;//新的需要流过的流量
152                 pcnt = 0;
153                 g[pos[i]].cap = INF;
154                 memset(vis, 0, sizeof(vis));
155                 if(Dinic())//如果增广成功,那么这条最小割满足
156                        ans[ret++] = node(g[pos[i]].u, g[pos[i]].v);
157                 for(int j=0; j<pcnt; ++j)
158                     g[p[j]].cap = preCost[p[j]];//将Dinic中所经过的边的值恢复成第一次Dinic之后的值!
159                 g[pos[i]].cap = 0;
160             }
161             if( ret > 0 ){
162                 sort(ans, ans+ret, cmp);
163                 printf("possible option:(%d,%d)", ans[0].x, ans[0].y);
164                 for(int i=1; i<ret; ++i)
165                     printf(",(%d,%d)", ans[i].x, ans[i].y);
166                 printf("\n");
167             }
168             else printf("not possible\n");
169         }
170     }    
171     return 0;
172 }
View Code

 

转载于:https://www.cnblogs.com/hujunzheng/p/4014923.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

随机数归并排序c语言,用C语言实现归并排序

#include#include#include#include#define random(i) (rand()%i)#define N 12#define INFINITY 99999999//要排序的数存放在a数组汇总&#xff0c;p,q,r是数组下标void Merge(int *a,int p,int q,int r){int n1q-p1;int n2r-q;int *L(int *)malloc(sizeof(int)*n1);int *R(int …

UVAoj 11324 - The Largest Clique(tarjan + dp)

题意&#xff1a;给定一个有向图&#xff0c;寻找一个点数最大集合&#xff0c;使得这个集合中的任意两个点 u,v, 都有u->v 或者 v->u 或者u<>v 思路&#xff1a;首先将强连通分量通过tarjan算法求出来&#xff0c;然后进行缩点&#xff0c;也就是每一个缩点 所组成…

android开发蓝牙自动连接电脑上,Android蓝牙开发之自动连接设备

自动连接使用的是SharedPreferences这个来解决。private void Automaticconnection() {SharedPreferences sp getSharedPreferences("Dizhi", MODE_PRIVATE);String address sp.getString("address", "");if (!address.equals("")) …

hdu 2014鞍山赛区 5073 Galaxy

题意&#xff1a;就是给你 n 个数&#xff0c;代表n个星球的位置&#xff0c;每一个星球的重量都为 1 &#xff01; 开始的时候每一个星球都绕着质心转动&#xff0c;那么质心的位置就是所有的星球的位置之和 / 星球的个数 现在让你移动 k 个星球到任意位置&#xff08;多个星球…

android onitemclicklistener 参数,android – 对listview中的项使用setOnItemClickListener

大家好,有一个应用程序,可以在SD卡上保存音频.我创建了一个listview,它从sdcard中检索文件名.我正在尝试设置一个监听器,所以当单击文件名时,我可以启动另一个播放该文件的意图.当我尝试设置监听器并传入一个新的OnItemClickListener()时,eclipse是红色的下划线.我知道我必须实…

DRF之请求与响应

目录 一、模块与包回顾 二、反序列化校验源码分析(了解) 三、断言 四、drf之请求 【1】源码分析 【2】配置视图类能处理的编码格式 五、drf之响应 【1】源码 【2】响应编码格式 一、模块与包回顾 模块与包 什么是模块&#xff1f; 一个py文件&#xff0c;被别的py文件…

android 常用注解,Android 开发小工具之:注解 Annotation

Android Support 包之一的 support-annotations是通过静态编译检测来提高代码质量的一个注解工具。里面包含了 Android 开发中常用的代码检测注解&#xff0c;帮助开发者提高代码质量。通过 SDK Manager下载 Android Support Repository 后&#xff0c;在 Gradle 中通过如下声明…

codeforces B. Friends and Presents(二分+容斥)

题意&#xff1a;从1....v这些数中找到c1个数不能被x整除&#xff0c;c2个数不能被y整除&#xff01; 并且这c1个数和这c2个数没有相同的&#xff01;给定c1, c2, x, y&#xff0c; 求最小的v的值&#xff01; 思路&#xff1a; 二分容斥&#xff0c;二分找到v的值&#xff0c;…

android音量键广播,音量控制键控制的音频流(setVolumeControlStream)描述

音量控制键控制的音频流(setVolumeControlStream)描述2021-01-03 16:18Android教程网 Android当开发多媒体应用或者游戏应用的时候&#xff0c;需要使用音量控制键来设置程序的音量大小,在Android系统中有多种音频流,感兴趣的朋友可以了解下当开发多媒体应用或者游戏应用的时候…

eclipse的使用

eclipse如何打开一个已存在的工程&#xff01;先给eclipse创建一个workspace,这个workspace就是一个文件夹用来管理eclipse项目的&#xff0c;或者修改eclipse的workspace,选择菜单file->switch workspace->other,选择一个已经存在的workspace。将已经存在的项目导入到wo…

Android延伸布局到状态栏,Android 状态栏透明

前言&#xff1a;最近项目大量用到状态栏透明&#xff0c;网上也出现很多库可以直接拿来用&#xff0c;个人认为没有必要那么重引用到一个库(有木有同学和我有一样的想法)&#xff0c;所以研究了一番&#xff0c;在此做个记录加强记忆也便后期查阅&#xff0c;如果无意中有幸能…

glassfish服务器默认的网页所在的位置

http://localhost:8080/ 默认打开的网页所在的位置 E:/glassfish-4.1/glassfish/domains/domain1/docroot/index.html 转载于:https://www.cnblogs.com/hujunzheng/p/4052920.html

华为HarmonyOS 鸿蒙,华为鸿蒙HarmonyOS2.0手机开发者Beta版正式发布

据悉&#xff0c;本次手机开发者Beta测试支持以下中国境内主制式手机及平板电脑。手机&#xff1a;全网通(5G双卡)P40 、 全网通版P40 Pro、Mate30、Mate30(5G) 、Mate30 Pro、Mate30 Pro(5G)&#xff0c;型号清单为ANA-AN00、ELS-AN00、TAS-AL00、TAS-AN00、LIO-AL00、LIO-AN0…

http协议客户端向服务器端请求时一般需要发送的内容

out.println("GET /shopping/index.html HTTP/1.1");//请求行 包括请求方式&#xff0c;文件路径&#xff0c; http协议版本&#xff08;必写&#xff09;请求头.... out.println("Aceept: */*");//客户端能够处理的文件类型&#xff08;不是必须&#xff…

android oneshot自动播放bug,移动端常见bug汇总001

前言本文是摘录整理了移动端常见的一些bug以及解决方案&#xff0c;第一篇&#xff0c;后面还会有持续的文章更新整理。点击样式闪动Q: 当你点击一个链接或者通过Javascript定义的可点击元素的时候&#xff0c;它就会出现一个半透明的灰色背景。A:根本原因是-webkit-tap-highli…

int.class 与 Integer.class

TYPE 表示的引用类型所对应的基本类型的Class对象&#xff01; 转载于:https://www.cnblogs.com/hujunzheng/p/4055471.html

android uber启动动画,模仿Uber的启动画面(上)

启动画面(Splash Screen)——不但给开发者们提供了一个尽情发挥、创建有趣动画的机会&#xff0c;也填补了App启动时从终端慢吞吞地下载数据的时间。启动画面(动态的)对于App至关重要&#xff1a;它可以让用户不失兴趣地耐心等待应用完成加载。尽管现在的启动画面多种多样&…

java中产生对象的两种方式

/** 普通new对象的过程&#xff01;*/Person pp new Person();System.out.println(pp);/** 利用代用参数的构造器产生对象实例&#xff01;* 首先获得相应带参数的构造器&#xff0c;然后利用构造器产生对象实例&#xff01;*/pclass Class.forName("get_class_method.P…

智慧屏用鸿蒙的生态,紧随鸿蒙OS手机版 ,智慧屏为什么对鸿蒙生态这么重要?...

原标题&#xff1a;紧随鸿蒙OS手机版 &#xff0c;智慧屏为什么对鸿蒙生态这么重要&#xff1f;12 月 21 日&#xff0c;华为正式发布了两款智慧屏新品&#xff0c;智慧屏 S 系列和车载智慧屏&#xff0c;前者是智慧屏的新系列&#xff0c;后者则是新开辟的车机产品线。没有意外…

java中反射机制通过字节码文件对象获取字段和函数的方法

pclass Class.forName("get_class_method.Person");//Field ageField pclass.getField("age");//因为age成员变量是私有的&#xff0c;所以会产生NoSuchFieldException异常Field ageField pclass.getDeclaredField("age");//获得该对象反映此…