思路:模板题就不多说了;
/***************************************** Author :Crazy_AC(JamesQi) Time :2015 File 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_back template<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; }
#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; }