zoj 2587 Unique Attack 最小割判定
让你判断最小割是否唯一。
判断方法是, 先求一遍最大流, 然后从源点dfs一次, 搜索未饱和边的数目。 从汇点dfs一次, 同样也是搜索未饱和边的数目, 看总和是否等于n。 如果等于n那么唯一。
具体可以看这里, http://www.cnblogs.com/Lyush/archive/2013/05/01/3053640.html。
- #include<bits/stdc++.h>
- using namespace std;
- #define mem(a) memset(a, 0, sizeof(a))
- #define mem1(a) memset(a, -1, sizeof(a))
- const int inf = 1e8;
- const int maxn = 2e4+;
- int head[maxn*], s, t, num, q[maxn*], dis[], vis[], cnt;
- struct node
- {
- int to, nextt, c;
- }e[maxn*];
- void init() {
- mem1(head);
- num = cnt = ;
- mem(vis);
- }
- void add(int u, int v, int c) {
- e[num].to = v; e[num].nextt = head[u]; e[num].c = c; head[u] = num++;
- e[num].to = u; e[num].nextt = head[v]; e[num].c = c; head[v] = num++;
- }
- int bfs() {
- int u, v, st = , ed = ;
- mem(dis);
- dis[s] = ;
- q[ed++] = s;
- while(st<ed) {
- u = q[st++];
- for(int i = head[u]; ~i; i = e[i].nextt) {
- v = e[i].to;
- if(e[i].c&&!dis[v]) {
- dis[v] = dis[u]+;
- if(v == t)
- return ;
- q[ed++] = v;
- }
- }
- }
- return ;
- }
- int dfs(int u, int limit) {
- if(u == t)
- return limit;
- int cost = ;
- for(int i = head[u]; ~i; i = e[i].nextt) {
- int v = e[i].to;
- if(e[i].c&&dis[u] == dis[v]-) {
- int tmp = dfs(v, min(limit-cost, e[i].c));
- if(tmp>) {
- e[i].c -= tmp;
- e[i^].c += tmp;
- cost += tmp;
- if(cost == limit)
- break;
- } else {
- dis[v] = -;
- }
- }
- }
- return cost;
- }
- int dinic() {
- int ans = ;
- while(bfs()) {
- ans += dfs(s, inf);
- }
- return ans;
- }
- void dfs(int u) {
- vis[u] = ;
- cnt++;
- for(int i = head[u]; ~i; i = e[i].nextt) {
- int v = e[i].to;
- if(!vis[v]&&e[i].c) {
- dfs(v);
- }
- }
- }
- void dfs1(int u) {
- vis[u] = ;
- cnt++;
- for(int i = head[u]; ~i; i = e[i].nextt) {
- int v = e[i].to;
- if(!vis[v]&&e[i^].c) {
- dfs1(v);
- }
- }
- }
- int main()
- {
- int n, m, x, y, z;
- while(scanf("%d%d%d%d", &n, &m, &s, &t)) {
- if(n+m+s+t==)
- break;
- init();
- while(m--) {
- scanf("%d%d%d", &x, &y, &z);
- add(x, y, z);
- }
- int ans = dinic();
- dfs(s);
- dfs1(t);
- if(cnt == n) {
- cout<<"UNIQUE"<<endl;
- } else {
- cout<<"AMBIGUOUS"<<endl;
- }
- }
- }
zoj 2587 Unique Attack 最小割判定的更多相关文章
- ZOJ 2587 Unique Attack (最小割唯一性)
题意 判断一个无向图的割是否唯一 思路 错误思路:一开始想的是判断割边是否都是关键割边,那既然割边两端点能连通S.T点的边是关键边,那么只要遇到有某个边两端点不连通S or T则这条边就不是关键割边( ...
- ZOJ 2587 Unique Attack(最小割唯一性判断)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2587 题意:判断最小割是否唯一. 思路: 最小割唯一性的判断是先跑一遍最大 ...
- ZOJ - 2587 Unique Attack (判断最小割是否唯一)
题意:判断最小割是否唯一. 分析:跑出最大流后,在残余网上从源点和汇点分别dfs一次,对访问的点都打上标记. 若还有点没有被访问到,说明最小割不唯一. https://www.cnblogs.com/ ...
- zoj 2587 Unique Attack【最小割】
拆点拆魔怔了 直接按照原图建就行,这里有个小技巧就是双向边的话不用按着板子建(u,v,c)(v,u,0)(v,u,c)(u,v,0),直接建(u,v,c)(v,u,c)会快十倍!800ms->8 ...
- ZOJ-2587-Unique Attack(最小割的唯一性)
题意: 求无向图最小割是否唯一 分析: 1.我们先对原图求一次最大流 2.对残留网络,我们从S开始,找到所有所有S能到达的点:再从T开始,找出所有能到达T的点. 3.判断原网络中是否还有没有访问到的点 ...
- ZOJ 2676 Network Wars ★(最小割算法介绍 && 01分数规划)
[题意]给出一个带权无向图,求割集,且割集的平均边权最小. [分析] 先尝试着用更一般的形式重新叙述本问题.设向量w表示边的权值,令向量c=(1, 1, 1, --, 1)表示选边的代价,于是原问题等 ...
- ZOJ 3792 Romantic Value 最小割(最小费用下最小边数)
求最小割及最小花费 把边权c = c*10000+1 然后跑一个最小割,则flow / 10000就是费用 flow%10000就是边数. 且是边数最少的情况.. #include<stdio. ...
- zoj 2532 Internship【最小割】
就是求哪些边在最大流上满流,也就是找割边.把0作为t点,s向所有的1~n连流量为inf的边,其他的边按照流量连.跑一遍最大流,从s顺着有残余流量的正向边dfs打标记fr,从t顺着正向边有残余流量的反向 ...
- [ZOJ2587]Unique Attack
vjudge sol 最小割判定唯一性. 只要做完一个任意最小割后,判断一下是不是所有点都要么和\(S\)相连,要么和\(T\)相连. 只要两边各一次\(dfs\)就行了. code #include ...
随机推荐
- 兼容所有浏览器的CSS3圆角
兼容所有浏览器的CSS3圆角 解决CSS3圆角兼容所有浏览器的方法.本文提到了一种很不错的实现跨浏览器圆角的解决方案,但是说的不够全面,前端观察最近将整理更多更全面的资源给大家,敬请期待. ...
- EBS R12 怎么修改APPS密码
apps 和 applsys 的口令 $> FNDCPASS apps/<apps password> 0 Y system/<system password> SYST ...
- ios 中的构造方法
构造方法 1.什么是构造方法? 初始化对象的方法. 默认情况下,在 OC 当中创建1个对象分为两部分(new 做的事): +alloc:分配内存空间 -init :初始化对象 2.构造方法的作用是? ...
- JVM学习之强引用、弱引用、软引用、虚引用
转自:http://my.oschina.net/ydsakyclguozi/blog/404389 多谢博主分享 1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象 ...
- mysql建立数据库的方法
mysql建立数据库的方法 方法一:使用create mysql> create database roudy; Query OK, 1 row affected (0.00 sec) mysq ...
- Android Shape画圆,矩形
画圆环代码如下: 画圆环,外边的边界宽度大一点即可: <?xml version="1.0" encoding="utf-8"?> <shap ...
- Python中进行Base64编码和解码
Base64编码 广泛应用于MIME协议,作为电子邮件的传输编码,生成的编码可逆,后一两位可能有“=”,生成的编码都是ascii字符.优点:速度快,ascii字符,肉眼不可理解缺点:编码比较长,非常容 ...
- EditText无法失去焦点、失去焦点隐藏软键盘
很奇怪,我在给EditText设置setOnFocusChangeListener()监听,但是始终未能成功,焦点一直存在,不知其原因,,代码如下: et_username.setOnFocusCha ...
- DMVsinSQLServer -- 备
/*************************************************************************************************** ...
- 转 批处理 %~dp0的意义
http://nealcai.iteye.com/blog/1685192 http://blog.csdn.net/caz28/article/details/7448677 http://stac ...