CDOJ 1962 ?????????vs?????????2???????????????

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CDOJ 1962 ?????????vs?????????2???????????????相关的知识,希望对你有一定的参考价值。

?????????class   ??????   ems   als   ??????   +=   while   using   ??????   

???s=0,t=n+m+1???????????????????????????????????????????????????????????????0???????????????????????????1???20?????????????????????????????????1??????ai - m???bi - n???????????????s???n?????????????????????ai???????????????t???m?????????????????????bi?????????n???????????????m???????????????19???????????????????????????Dinic????????????????????????t?????????????????????????????????“Yes”???????????????“No”????????????????????????????????????????????????????????????????????????19-???????????????????????????????????????

  1 #include <queue>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <iostream>
  5 #include <algorithm>
  6 using namespace std;
  7 
  8 const int N=100;
  9 const int M=N*N;
 10 const int INF = 0x3f3f3f3f;
 11 int s,t,n,m,cnt;
 12 int a[N],b[N];
 13 int Head[N],Depth[N],Next[M],V[M],W[M];
 14 
 15 void init()
 16 {
 17     cnt=-1;
 18     memset(Head,-1,sizeof(Head));
 19     memset(Next,-1, sizeof(Next));
 20 }
 21 
 22 void add_edge(int u,int v,int w)
 23 {
 24     cnt++;Next[cnt]=Head[u];V[cnt]=v;W[cnt]=w;Head[u]=cnt;
 25     cnt++;Next[cnt]=Head[v];V[cnt]=u;W[cnt]=0;Head[v]=cnt; // ?????????
 26 }
 27 
 28 bool bfs()
 29 {
 30     queue<int> q;
 31     while(!q.empty())q.pop();
 32     memset(Depth,0, sizeof(Depth));
 33     q.push(s);
 34     Depth[s]=1;
 35     while(!q.empty())
 36     {
 37         int u=q.front();q.pop();
 38         for(int i=Head[u];i!=-1;i=Next[i])
 39         {
 40             if(W[i]>0&&Depth[V[i]]==0)
 41             {
 42                 Depth[V[i]]=Depth[u]+1;
 43                 q.push(V[i]);
 44             }
 45         }
 46     }
 47     if(Depth[t]==0)return false;
 48     else return true;
 49 }
 50 
 51 int dfs(int u,int flow)
 52 {
 53     if(u==t)return flow;
 54     int rest = flow;
 55     for(int i=Head[u];i!=-1;i=Next[i])
 56     {
 57         if(Depth[V[i]]==Depth[u]+1&&W[i]>0)
 58         {
 59             int k=dfs(V[i],min(W[i],rest));
 60             if(!k)Depth[V[i]]=0;  // ?????????????????????????????????
 61             W[i]-=k;
 62             W[i^1]+=k;
 63             rest-=k;
 64         }
 65     }
 66     return flow-rest;
 67 }
 68 
 69 int Dinic()
 70 {
 71     int ans=0;
 72     while(bfs()) // ?????????????????????????????????
 73     {
 74         while(int flow = dfs(s,INF)) // ???????????????????????????
 75             ans+=flow;
 76     }
 77     return ans;
 78 }
 79 
 80 void print()
 81 {
 82     int res[N][N];
 83     memset(res,0,sizeof(res));
 84     for(int i=1;i<=n;i++)
 85         for(int j=Head[i];j!=-1;j=Next[j])
 86         {
 87             int v=V[j];
 88             if(v>n&&v<=n+m)res[i][v-n]=19-W[j]+1;
 89         }
 90     for(int i=1;i<=n;i++){
 91         for(int j=1;j<=m;j++){
 92             printf("%d",res[i][j]);
 93             if(j==m) printf("
");
 94             else printf(" ");
 95         }
 96     }
 97 }
 98 
 99 int main(){
100     init();
101     scanf("%d%d",&n,&m);
102     s=0;t=n+m+1;
103 
104     for(int i=1;i<=n;i++){
105         scanf("%d",&a[i]);a[i]-=m;
106         add_edge(s,i,a[i]);
107     }
108     for(int i=1;i<=m;i++){
109         scanf("%d",&b[i]);b[i]-=n;
110         add_edge(n+i,t,b[i]);
111     }
112 
113     for(int i=1;i<=n;i++)
114         for(int j=1;j<=m;j++)
115             add_edge(i,n+j,19);
116 
117     int c1=0,c2=0,c3=0;
118     for(int i=1;i<=n;i++) c1+=a[i];
119     for(int i=1;i<=m;i++) c2+=b[i];
120     if(c1!=c2) printf("No
");
121     else{
122         c3=Dinic();
123         if(c3!=c2) printf("No
");
124         else{
125             printf("Yes
");
126             print();
127         }
128     }
129     return 0;
130 }

??????Edmonds-Karp?????????????????????: ?????????BFS?????????????????????????????????????????????????????????

 1 const int inf = 1<<29,N=2010,M=20010;
 2 int head[N],ver[M],edge[M],Next[M],v[N],incf[N],pre[N];
 3 int n,m,s,t,tot,maxflow;
 4 
 5 void add(int x,int y,int z)
 6 {
 7     tot++,ver[tot]=y,edge[tot]=z,Next[tot]=head[x],head[x]=tot; // ????????????????????????
 8     tot++,ver[tot]=x,edge[tot]=0,Next[tot]=head[y],head[y]=tot; //????????????edge????????????
 9 }
10 
11 bool bfs()
12 {
13     memset(v,0, sizeof(v));
14     queue<int> q;
15     q.push(s);v[s]=1;
16     incf[s]=inf; // ???????????????????????????????????????
17     while(q.size())
18     {
19         int x = q.front();
20         q.pop();
21         for(int i=head[x];i;i=Next[i])
22         {
23             if(edge[i])
24             {
25                 int y=ver[i];
26                 if(v[y])continue;
27                 incf[y]=min(incf[x],edge[i]);
28                 pre[y]=i; // ????????????(?????????tot?????????????????????????????????????????????????????????)
29                 q.push(y);
30                 v[y]=1;
31                 if(y==t)return 1; // ??????t???
32             }
33         }
34     }
35     return 0;
36 }
37 
38 void update()// ???????????????????????????????????????????????????
39 {
40     int x = t;
41     while(x!=s)
42     {
43         int i=pre[x];
44         edge[i]-=incf[t];
45         edge[i^1]+=incf[t];
46         x = ver[i^1]; // ????????????
47     }
48     maxflow+=incf[t];
49 }
50 
51 int main()
52 {
53     while(cin>>m>>n)
54     {
55         memset(head,0, sizeof(head));
56         s=1,t=n;tot=1;maxflow=0;
57         for(int i=1;i<=m;i++)
58         {
59             int x,y,c;
60             scanf("%d%d%d",&x,&y,&c);
61             add(x,y,c);
62         }
63         while(bfs())update();
64         cout<<maxflow<<endl;
65     }
66 }

 

以上是关于CDOJ 1962 ?????????vs?????????2???????????????的主要内容,如果未能解决你的问题,请参考以下文章

cdoj1588 潘爷泡妹

CDOJ 876 爱管闲事

CDoj--Search gold(dp)

cdoj1324暴力分块

cdoj 1489 老司机采花

cdoj1587 失恋772002天