LA3231 Fair Share 二分_网络流

Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=50004;
const int INF=10000000;
# define  pb push_back
int N,M;
int s,t;
struct Edge{
    int from,to,cap;
    Edge(int u,int v,int c):from(u),to(v),cap(c) {}
};
struct Dicnic{
   vector<Edge>edges;
   vector<int>G[maxn];
   int d[maxn],vis[maxn],cur[maxn];
   queue<int>Q;
   void init(){
    for(int i=0;i<maxn;++i)G[i].clear();
    edges.clear();
   }
   void addedge(int u,int v,int c){
    edges.pb(Edge(u,v,c));               //正向弧
    edges.pb(Edge(v,u,0));               //反向弧
    int m=edges.size();
    G[u].pb(m-2);
    G[v].pb(m-1);
   }
   int BFS()
   {
    memset(vis,0,sizeof(vis));
    d[s]=0,vis[s]=1;Q.push(s);
    while(!Q.empty()){
        int u=Q.front();Q.pop();
        int sz=G[u].size();
        for(int i=0;i<sz;++i){
            Edge e=edges[G[u][i]];
            if(!vis[e.to]&&e.cap>0){
                d[e.to]=d[u]+1,vis[e.to]=1;
                Q.push(e.to);
            }
        }
    }
    return vis[t];
   }
   int dfs(int x,int a){
       if(x==t)return a;
       int sz=G[x].size();
       int f,flow=0;
       for(int i=cur[x];i<sz;++i){
        Edge e=edges[G[x][i]];
          cur[x]=i;
        if(d[e.to]==d[x]+1&&e.cap>0){
            f=dfs(e.to,min(a,e.cap));
            if(f)
            {
                int u=G[x][i];
                a-=f;
                    edges[u].cap-=f;
                    edges[u^1].cap+=f;
                    flow+=f;
                    if(a==0)break;
            }
        }
       }
       return flow;
   }
   int maxflow(){
    int ans=0;
    while(BFS()){
         memset(cur,0,sizeof(cur));
         ans+=dfs(s,INF);
    }
    return ans;
   }
   int check(int x)
   {
     int siz=G[0].size();
      for(int i=0;i<siz;++i)edges[G[s][i]].cap=1,edges[G[s][i]^1].cap=0;
      for(int i=1;i<=M;++i)
      {
        int sz=G[i].size();
        for(int j=0;j<sz;++j)
        {
            int v=edges[G[i][j]].to;
            if(v!=s){
                edges[G[i][j]].cap=1,edges[G[i][j]^1].cap=0;
            }
        }
      }
      for(int i=M+1;i<=N+M;++i)
      {
        int sz=G[i].size();
        for(int j=0;j<sz;++j)
        {
            int v=edges[G[i][j]].to;
            if(v==t){
                edges[G[i][j]].cap=x,edges[G[i][j]^1].cap=0;
            }
        }
      }
      int uu=maxflow();
      if(uu==M)return 1;
      return 0;
   }
   int operate()
   {
     int L=0,R=12000;
     int fin=0;
     while(L<=R)
     {
          int mid=(L+R)/2;
          if(check(mid)){fin=mid,R=mid-1;}
          else L=mid+1;
     }
      return fin;
   }
}op;
int main()
{
    //freopen("in.txt","r",stdin);
    int T;
    scanf("%d",&T);
    while(T--)
    {
        op.init();
        scanf("%d%d",&N,&M);
          s=0,t=N+M+1;
          for(int i=1;i<=M;++i)op.addedge(s,i,1);
        for(int i=1;i<=M;++i){
            int a,b;
            scanf("%d%d",&a,&b);
            a+=M,b+=M;
            op.addedge(i,a,1);
            op.addedge(i,b,1);
        }
        for(int i=M+1;i<=N+M;++i)op.addedge(i,t,0);
        printf("%d\n",op.operate());
    }
     return 0;
}

  

posted @   EM-LGH  阅读(171)  评论(0编辑  收藏  举报
编辑推荐:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
点击右上角即可分享
微信分享提示