博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ZOJ 2587 Unique Attack 判断最小割是否唯一
阅读量:5033 次
发布时间:2019-06-12

本文共 2142 字,大约阅读时间需要 7 分钟。

很裸的判断最小割是否唯一。判断方法是先做一遍最大流求最小割,然后从源点和汇点分别遍历所有能够到达的点,看是否覆盖了所有的点,如果覆盖了所有的点,那就是唯一的,否则就是不唯一的。

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long LL;const int maxn = 800 + 5;const int maxm = 80000;const int INF = INT_MAX / 2;int n,m,s,t;int first[maxn],nxt[maxm];int ecnt,v[maxm],cap[maxm];int q[maxn],qs,qe;bool vis[maxn];void adde(int uu,int vv,int ww) { v[ecnt] = vv; cap[ecnt] = ww; nxt[ecnt] = first[uu]; first[uu] = ecnt++; v[ecnt] = uu; cap[ecnt] = 0; nxt[ecnt] = first[vv]; first[vv] = ecnt++;}int level[maxn];bool bfs() { memset(level,0,sizeof(level)); qs = qe = 0; q[qe++] = s; level[s] = 1; while(qs < qe) { int now = q[qs++]; if(now == t) break; for(int i = first[now];~i;i = nxt[i]) { if(cap[i] && level[v[i]] == 0) { q[qe++] = v[i]; level[v[i]] = level[now] + 1; } } } return level[t];}int dfs(int now,int alpha) { if(now == t) return alpha; int sum = 0; for(int i = first[now];~i && alpha;i = nxt[i]) { if(cap[i] && level[v[i]] == level[now] + 1) { int ret = dfs(v[i],min(alpha,cap[i])); sum += ret; alpha -= ret; cap[i] -= ret; cap[i ^ 1] += ret; } } if(sum == 0) level[now] = -1; return sum;}void solve() { //先做一遍最大流 while(bfs()) dfs(s,INF); //分别从起点和终点做一遍bfs memset(vis,0,sizeof(vis)); qs = qe = 0; q[qe++] = s; vis[s] = true; while(qs < qe) { int now = q[qs++]; for(int i = first[now];~i;i = nxt[i]) { if(cap[i] && !vis[v[i]]) { vis[v[i]] = true; q[qe++] = v[i]; } } } qs = qe = 0; q[qe++] = t; vis[t] = true; while(qs < qe) { int now = q[qs++]; for(int i = first[now];~i;i = nxt[i]) { if(cap[i ^ 1] && !vis[v[i]]) { vis[v[i]] = true; q[qe++] = v[i]; } } } for(int i = 1;i <= n;i++) { if(!vis[i]) { puts("AMBIGUOUS"); return; } } puts("UNIQUE");}int main() { while(scanf("%d%d%d%d",&n,&m,&s,&t),n) { memset(first,-1,sizeof(first)); ecnt = 0; for(int i = 0;i < m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); adde(a,b,c); adde(b,a,c); } solve(); } return 0;}

 

转载于:https://www.cnblogs.com/rolight/p/3873313.html

你可能感兴趣的文章
《敏捷开发绩效管理》扩展阅读(敏捷开发绩效管理,敏捷团队绩效管理)
查看>>
Jquery怎么获取select选中项 自定义属性的值
查看>>
CKEditor (Toolbar Definition)工具栏自定义配置
查看>>
在vscode成功配置Python环境
查看>>
mysql table 最新更新时间
查看>>
个人永久性免费-Excel催化剂功能第37波-把Sqlserver的强大分析函数拿到Excel中用...
查看>>
PHP中字符串比较的常用方法
查看>>
html5--6-2 CSS语法
查看>>
JavaScript--语法3--数组
查看>>
华为在线题--计算字符个数
查看>>
html5--6-24 css3前缀
查看>>
[iOS] UIFont 设置字体
查看>>
C# 6.0可能的新特性
查看>>
快递在线下单
查看>>
Elasticsearch中Head插件的使用
查看>>
左旋转字符串
查看>>
IOS - socket 编程初体验
查看>>
第一天(数据库操作)
查看>>
解读“统一价格分评审方法”
查看>>
大道至简第七、八章读后感
查看>>