1. 程式人生 > >HDU1845Jimmy’s Assignment(無向圖,最大匹配)

HDU1845Jimmy’s Assignment(無向圖,最大匹配)

comment 最大匹配 tex dfs asc ddc repr freopen ces

題意:就是求最大匹配

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
#include<string>
#include<cstring>
#include<stack>
#include<queue>
#include<vector>
#include<limits>
#include<ctime>
#include<cassert> #include<cstdlib> #define lson (rt<<1),L,M #define rson (rt<<1|1),M+1,R #define M ((L+R)>>1) #define cl(a,b) memset(a,b,sizeof(a)); #define LL long long #define P pair<int,int> #define X first #define Y second #define pb push_back #define fread(a) freopen(a,"r",stdin);
#define fwrite(a) freopen(a,"w",stdout); using namespace std; const int maxn=5005; const int inf=999999; vector<int> G[maxn]; int matching[maxn]; bool vis[maxn]; int num; bool dfs(int u){ int N=G[u].size(); for(int i=0;i<N;i++){ int v=G[u][i]; if(vis[v])continue; vis[v]=true
; if(matching[v]==-1||dfs(matching[v])){ matching[v]=u; return true; } } return false; } int hungar(){ int ans=0; cl(matching,-1); for(int i=0;i<num;i++){ cl(vis,false); if(dfs(i))ans++; } return ans/2;//無向邊,算了所有。除2 } int main(){ int T; scanf("%d",&T); while(T--){ int n; scanf("%d",&n); for(int i=0;i<=n;i++)G[i].clear(); int m=n*3/2; while(m--){ int x,y; scanf("%d%d",&x,&y); x--;y--; G[x].pb(y);//這裏是無向邊 G[y].pb(x); } num=n; int ans=hungar(); printf("%d\n",ans); } return 0; }

HDU1845Jimmy’s Assignment(無向圖,最大匹配)