nyoj-489-dinic/建图
2018-07-29 11:01
337 查看
哭泣天使
时间限制:1000 ms | 内存限制:65535 KB 难度:5- 描述
-
Doctor Who乘着Tardis带着Amy来到了一个星球,一开Tadis大门,发现这个星球上有个壮观的石像群,全是一些天使石像,有的石像在哭泣,有的石像像在微笑,共有m行n列,Doctor用“音速起子”扫描了一下整个石像群,得到了每行天使中在哭泣的天使的个数。当他与Amy在这里行走了一段时间之后,Doctor忽然想起了什么,怀疑这些石像是不是传说中的一种黑暗生物——“哭泣天使”——一种看似石像,却会在人不看它的时候移动,会强制把人送回某个过去的时间点,并借此汲取时间能量的生物。Doctor可不想自己和Amy迷失在一个未知的时间点里,于是Doctor立刻用“音速起子”又扫描了整个石像群,想再看看每行的在哭泣的天使个数与刚才是否相符,但是,越急就越容易出错,他一不小心扫描错了,扫描出了每列中哭泣的天使的个数。现在,由于音速起子的能量不足了,他不能够再次扫描,他想根据已有的数据判断出是否有天使改变了自己的表情,从哭泣变成不哭泣或者从不哭泣变成哭泣了。
- 输入
- 第一行是一个整数T,表示共有T组测试数据(T<=50)
每组测试数据第一行是两个整数m,n(0<m,n<=300)分别表示行数和列数
随后的两行分别有m个数和n个数分别表示对应m行中哭泣的天使石像的个数与对应n个列中哭泣的天使石像的个数。 - 输出
- 如果能根据已有信息判断出必然有石像改变了表情,则输出Terrible
如果根据已有信息无法确定石像发生了改变,则输出Not Sure (有时,你确定两次扫描时状态相同,但由于不确定之间是否发生过改变,故也输出Not Sure) - 样例输入
-
2 2 3 1 1 1 1 0 3 3 0 1 2 3 0 0
- 样例输出
-
Not Sure Terrible
- 来源
- [张云聪]原创
- 上传者
- 张云聪
- 建立出m*n个格子节点,m个行节点和n个列节点,还有一个超级源点,一个超级汇点。建图: 超级源点向每个行节点连边,权值为r[i], 每个列节点向超级汇点连边,权值为c[i]。每个行节点向对应行内的格子节点连边,权值为1,每一列向对应的列节点连边权值为1。如果最大流和∑h不一样说明发生变化了。
-
#include<bits/stdc++.h> using namespace std; #define LL long long #define inf 0x3f3f3f3f const int maxn=101000; struct Edge { int v,w,next; }; class Dinic{ public: int d[maxn],cur[maxn],first[maxn],tot,s,t,n; bool vis[maxn]; Edge e[maxn<<3]; void init(int n,int s,int t){ this->n=n,this->s=s,this->t=t; tot=0; memset(first,-1,sizeof(first)); } void add(int u,int v,int w){ e[tot].v=v; e[tot].w=w; e[tot].next=first[u]; first[u]=tot++; e[tot].v=u; e[tot].w=0; e[tot].next=first[v]; first[v]=tot++; } bool bfs(){ memset(vis,0,sizeof(vis)); queue<int>q; q.push(s); d[s]=0; vis[s]=1; while(!q.empty()){ int u=q.front(); q.pop(); for(int i=first[u];~i;i=e[i].next){ if(!vis[e[i].v] && e[i].w>0){ vis[e[i].v]=1; d[e[i].v]=d[u]+1; q.push(e[i].v); } } } return vis[t]; } int dfs(int u,int a){ if(u==t||a==0)return a; int flow=0,f; for(int &i=cur[u];~i;i=e[i].next){ if(d[e[i].v]==d[u]+1 && (f=dfs(e[i].v,min(a,e[i].w)))>0){ e[i].w-=f; e[i^1].w+=f; flow+=f; a-=f; if(!a) break; } } return flow; } int solve(){ int ans=0; while(bfs()){ for(int i=1;i<=n;++i) cur[i]=first[i]; ans+=dfs(s,inf) ; } return ans; } }AC; int r[333],c[333]; int main(){ int t,m,n,sum; scanf("%d",&t); while(t--){ int s1=0,s2=0; scanf("%d%d",&m,&n); sum=m*n+m+n+2; AC.init(sum,sum-1,sum); for(int i=1;i<=m;++i) { scanf("%d",r+i); s1+=r[i]; AC.add(sum-1,m*n+i,r[i]); for(int j=1;j<=n;++j) AC.add(m*n+i,(i-1)*n+j,1); } for(int i=1;i<=n;++i) { scanf("%d",c+i); s2+=c[i]; AC.add(m*n+m+i,sum,c[i]); for(int j=1;j<=m;++j) AC.add((j-1)*n+i,m*n+m+i,1); } //printf("%d\n",AC.solve()); if(s1!=s2){ puts("Terrible"); continue; } AC.solve()==s1?puts("Not Sure"):puts("Terrible"); } return 0; }
相关文章推荐
- NYOJ 489 最大流 Dinic 算法
- NYOJ 489-哭泣天使:最大流
- 《网络流学习笔记04 && NYOJ 489 哭泣天使(建边,超级源点和汇点)》
- NYOJ 489 哭泣天使(网络流)
- NYOJ 489 哭泣天使 最大流
- (NYoj 489)哭泣天使 -- 网络最大流,关于网格的建图方法,Dinic
- nyoj 489 哭泣天使 网络流 最大流 IASP
- nyoj 489 哭泣天使
- nyoj 489
- nyoj489哭泣的天使
- NYOJ 489-哭泣天使:最大流
- 寻找最大数 NYOJ 贪心
- nyoj题目31:5个数求最值
- nyoj 677暴力dfs竟然这么快...
- NYoj 278
- NYOJ 对称排序 283
- NYOJ 305 表达式求值
- NYOJ-67-三角形面积-2013年08月21日09:15:13
- NYOJ 71 独木舟上的旅行
- nyoj 499迷宫【DFS】