• nyoj-489-dinic/建图


    哭泣天使

    时间限制: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不一样说明发生变化了。
      1 #include<bits/stdc++.h>
      2 using namespace std;
      3 #define LL long long 
      4 #define inf 0x3f3f3f3f
      5 const int maxn=101000;
      6 struct Edge
      7 {
      8     int v,w,next;
      9 };
     10 class Dinic{
     11 public:
     12     int d[maxn],cur[maxn],first[maxn],tot,s,t,n;
     13     bool vis[maxn];
     14     Edge e[maxn<<3];
     15 
     16     void init(int n,int s,int t){
     17         this->n=n,this->s=s,this->t=t;
     18         tot=0;
     19         memset(first,-1,sizeof(first));
     20     }
     21 
     22     void add(int u,int v,int w){
     23         e[tot].v=v;
     24         e[tot].w=w;
     25         e[tot].next=first[u];
     26         first[u]=tot++;
     27 
     28         e[tot].v=u;
     29         e[tot].w=0;
     30         e[tot].next=first[v];
     31         first[v]=tot++;
     32     }
     33 
     34     bool bfs(){
     35         memset(vis,0,sizeof(vis));
     36         queue<int>q;
     37         q.push(s);
     38         d[s]=0;
     39         vis[s]=1;
     40         while(!q.empty()){
     41             int u=q.front();
     42             q.pop();
     43             for(int i=first[u];~i;i=e[i].next){
     44                 if(!vis[e[i].v] && e[i].w>0){
     45                     vis[e[i].v]=1;
     46                     d[e[i].v]=d[u]+1;
     47                     q.push(e[i].v);
     48                 }
     49             }
     50         }
     51         return vis[t];
     52     }
     53 
     54     int dfs(int u,int a){
     55         if(u==t||a==0)return a;
     56         int flow=0,f;
     57         for(int &i=cur[u];~i;i=e[i].next){
     58             if(d[e[i].v]==d[u]+1 && (f=dfs(e[i].v,min(a,e[i].w)))>0){
     59                 e[i].w-=f;
     60                 e[i^1].w+=f;
     61                 flow+=f;
     62                 a-=f;
     63                 if(!a) break;
     64             }
     65         }
     66         return flow;
     67     }
     68 
     69     int solve(){
     70         int ans=0;
     71         while(bfs()){
     72             for(int i=1;i<=n;++i) cur[i]=first[i];
     73             ans+=dfs(s,inf) ;
     74         }
     75         return ans;
     76     }
     77 }AC;
     78 int r[333],c[333];
     79 int main(){
     80     int t,m,n,sum;
     81     scanf("%d",&t);
     82     while(t--){
     83         int s1=0,s2=0;
     84         scanf("%d%d",&m,&n);
     85         sum=m*n+m+n+2;
     86         AC.init(sum,sum-1,sum);   
     87         for(int i=1;i<=m;++i) {
     88             scanf("%d",r+i);
     89             s1+=r[i];
     90             AC.add(sum-1,m*n+i,r[i]);
     91             for(int j=1;j<=n;++j) AC.add(m*n+i,(i-1)*n+j,1);
     92         }
     93         for(int i=1;i<=n;++i) {
     94             scanf("%d",c+i);
     95             s2+=c[i];
     96             AC.add(m*n+m+i,sum,c[i]);
     97             for(int j=1;j<=m;++j) AC.add((j-1)*n+i,m*n+m+i,1);
     98         }
     99     //printf("%d
    ",AC.solve());
    100     if(s1!=s2){
    101         puts("Terrible");
    102         continue;
    103     }
    104     AC.solve()==s1?puts("Not Sure"):puts("Terrible");
    105     }
    106     return 0;
    107 }
  • 相关阅读:
    《深度学习推荐系统中各类流行的Embedding方法(上)》
    《替代梯度下降——基于极大值原理的深度学习训练算法》&《加速对抗训练——YOPO算法浅析》
    《【炼丹技巧】功守道:NLP中的对抗训练 + PyTorch实现》
    《论文阅读:对抗训练(adversarial training)》
    《一文搞懂NLP中的对抗训练》
    CLOUD配置审批流发消息
    CLOUD财务成本核算
    K3CLOUDJOBPROCESS每分钟重启
    查看服务器日志
    数据规则列表加导入导出
  • 原文地址:https://www.cnblogs.com/zzqc/p/9384661.html
Copyright © 2020-2023  润新知