hdu2845二分图 Hopcroft-Karp Algorithm

来源:互联网 发布:苹果mac壁纸百度网盘 编辑:程序博客网 时间:2024/06/05 19:08

思路:模板题就不多说了;

/*****************************************Author      :Crazy_AC(JamesQi)Time        :2015File Name   :*****************************************/// #pragma comment(linker, "/STACK:1024000000,1024000000")#include <iostream>#include <algorithm>#include <iomanip>#include <sstream>#include <string>#include <stack>#include <queue>#include <deque>#include <vector>#include <map>#include <set>#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <limits.h>using namespace std;#define MEM(a,b) memset(a,b,sizeof a)#define pk push_backtemplate<class T> inline T Get_Max(const T&a,const T&b){return a < b?b:a;}template<class T> inline T Get_Min(const T&a,const T&b){return a < b?a:b;}typedef long long ll;typedef pair<int,int> ii;const int inf = 1 << 30;const int INF = 0x3f3f3f3f;const int MOD = 1e9 + 7;const int maxn = 5010;int uN,vN;int Mx[maxn],My[maxn];int dx[maxn],dy[maxn];bool vst[maxn];int dis;vector<int> G[maxn];bool Search_P(){queue<int> que;dis = INF;MEM(dx, -1);MEM(dy, -1);for (int i = 1;i <= uN;i++){if (Mx[i] == -1){que.push(i);dx[i] = 0;}}while(!que.empty()){int u = que.front();que.pop();if (dx[u] > dis) break;for (int i = 0;i < G[u].size();i++){int v = G[u][i];if (dy[v] == -1){dy[v] = dx[u] + 1;if (My[v] == -1){dis = dy[v];}else{dx[My[v]] = dy[v] + 1;que.push(My[v]);}}}}return dis != INF;}bool dfs(int u){for (int i = 0;i < G[u].size();i++){int v = G[u][i];if (!vst[v] && dy[v] == dx[u] + 1){vst[v] = 1;if (My[v] != -1 && dy[v] == dis) continue;if (My[v] == -1 || dfs(My[v])){Mx[u] = v;My[v] = u;return true;}}}return false;}inline int Hopcroft_Karp(){int ret = 0;MEM(Mx, -1);MEM(My, -1);while(Search_P()){MEM(vst, false);for (int i = 1;i <= uN;i++){if (Mx[i] == -1 && dfs(i))ret++;}}return ret;}int main(){// ios::sync_with_stdio(false);// freopen("in.txt","r",stdin);// freopen("out.txt","w",stdout);int T,n;// cin >> T;scanf("%d",&T);while(T--){// cin >> n;scanf("%d",&n);for (int i = 1;i <= n;i++)G[i].clear();for (int i = 0;i < n * 3 / 2;i++){int x,y;// cin >> x >> y;scanf("%d%d",&x,&y);G[x].push_back(y);G[y].push_back(x);}uN = vN = n;cout << Hopcroft_Karp() / 2 << endl;}return 0;}

下面就是神AC了,,,苍天,请收下我的膝盖吧!!!

#include<stdio.h>int main(){    int t,n,i,x,y;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        for(i=0;i<n*3/2;i++)        scanf("%d%d",&x,&y);        printf("%d\n",n/2);    }    return 0;}

0 0
原创粉丝点击