#include<cstdio> #include<cstring> #include<queue> using namespace std; const int INF = 0x3f3f3f3f; struct node{ int to,next,flow; }e[2000010]; int a[100010],b[100010],d[100010]; int S,T; int head[100010],cnt,cur[100010]; void add_edge(int from,int to,int flow){ e[cnt].to = to; e[cnt].flow = flow; e[cnt].next = head[from]; head[from] = cnt++; e[cnt].to = from; e[cnt].flow = 0; e[cnt].next = head[to]; head[to] = cnt++; } int bfs(){ memset(d,0,sizeof(d)); queue<int>q; q.push(S); d[S] = 1; while(!q.empty()){ int u = q.front(); q.pop(); for(int i = head[u]; i != -1; i = e[i].next){ int v = e[i].to; if(!d[v] && e[i].flow){ d[v] = d[u] + 1; if(v == T) return 1; q.push(v); } } } return 0; } int dfs(int u,int flow){ int cost = 0; if(u == T) return flow; for(int &i = cur[u]; i != -1; i = e[i].next){ int v = e[i].to; if(d[v] == d[u] + 1 && e[i].flow){ int t =dfs(v,min(flow - cost,e[i].flow)); if(t){ e[i].flow -= t; e[i^1].flow += t; cost += t; if(flow == cost) break; } } } return cost; } int Dinic(){ int res = 0; while(bfs()){ for(int i = 0; i <= T; i++) cur[i] = head[i]; res += dfs(S,INF); } return res; } int main(){ int t,n,m; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); for(int i = 1; i <= m; i++) scanf("%d%d",&a[i],&b[i]); int l = 1,r = m; S = 0; T = n + m + 1; while(l < r){ // printf("l = %d r = %d\n",l,r); int M = (l + r) / 2; for(int i = 0; i <= T; i++) head[i] = -1; cnt = 0; for(int i = 1; i <= m; i++) add_edge(0,i,1); for(int i = 1; i <= m; i++){ add_edge(i,m + a[i],1); add_edge(i,m + b[i],1); } for(int i = 1; i <= n; i++){ add_edge(m + i, T, M); } int t = Dinic(); if(t >= m){ r = M; }else l = M + 1; } printf("%d\n",l); } return 0; }
LA 3231 Fair Shar
猜你喜欢
转载自blog.csdn.net/sky_zdk/article/details/80357588
今日推荐
周排行