bzoj1854【二分圖】
阿新 • • 發佈:2019-02-07
第一次做的時候居然沒看出來二分圖。。
一直想資料結構。。。
中毒太深。。
#include <cstdio> #include <cstring> #include <iostream> using namespace std; int n; struct edge { int v,next; }e[4000010]; int cnt,head[1010010]; int Link[1010010],vis[1010010]; int read_int () { char c = getchar(); int re = 0; for(;c > '9' || c < '0';c = getchar()); for(;c >= '0' && c <= '9';c = getchar()) re = re * 10 + c - '0'; return re; } void adde (int u,int v) { e[++cnt].v = v; e[cnt].next = head[u]; head[u] = cnt; e[++cnt].v = u; e[cnt].next = head[v]; head[v] = cnt; } bool find (int u,int f) { for(int i = head[u];i != -1;i = e[i].next) { int v = e[i].v; if(vis[v] == f) continue; vis[v] = f; if(!Link[v] || find(Link[v],f)) { Link[v] = u; Link[u] = v; return 1; } } return 0; } int main () { memset(head,-1,sizeof head); n = read_int(); int upp = 0; for(int i = 1;i <= n;++i) { int t1 = read_int(); int t2 = read_int(); upp = max(upp,t1); upp = max(upp,t2); adde(t1 + n,i); adde(t2 + n,i); } for(int i = 1;i <= upp;++i) { if(Link[n + i]) continue; vis[n + i] = i; if(!find(n + i,i)) { printf("%d\n",i - 1); return 0; } } printf("%d\n",upp); }