标签:
2 4 4 2 1 2 2 1 2 2 2 3 2 3 4 1 2 2 1 2
Case #1: 2 1 2 2 1 2 1 3 1 4 Case #2: 2 1 2
感觉参考博客写的听仔细的
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<vector> #include<set> #include<map> #define L(x) (x<<1) #define R(x) (x<<1|1) #define MID(x,y) ((x+y)>>1) #define eps 1e-8 typedef __int64 ll; #define fre(i,a,b) for(i = a; i <b; i++) #define free(i,b,a) for(i = b; i >= a;i--) #define mem(t, v) memset ((t) , v, sizeof(t)) #define ssf(n) scanf("%s", n) #define sf(n) scanf("%d", &n) #define sff(a,b) scanf("%d %d", &a, &b) #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c) #define pf printf #define bug pf("Hi\n") using namespace std; #define INF 0x3f3f3f3f #define N 20005 int boy[N],girl[N],vis[N]; // 二分图 int time[N],low[N],cnt,time_num,instack[N],type[N]; //强连通 int n,m,mn; vector<int>g[N]; stack<int>q; bool dfs(int x) { int i,j; fre(i,0,g[x].size()) { int to=g[x][i]; if(vis[to]) continue; vis[to]=1; if(girl[to]==0||dfs(girl[to])) { boy[x]=to; girl[to]=x; return true; } } return false; } void xiong() { int i,j; mem(boy,0); mem(girl,0); fre(i,1,mn+1) { mem(vis,0); dfs(i); } } void leave() { int i,j; int all=2*mn; fre(i,1,mn+1) { if(boy[i]==0) { all++; fre(j,1,mn+1) g[j].push_back(all); boy[i]=all; girl[all]=i; } } fre(i,mn+1,mn*2+1) if(girl[i]==0) { all++; fre(j,mn+1,mn*2+1) g[all].push_back(j); boy[all]=i; girl[i]=all; } fre(i,1,all+1) { if(boy[i]) g[boy[i]].push_back(i); } } void tarjan(int x) { int i,j; time[x]=low[x]=++time_num; instack[x]=1; q.push(x); fre(i,0,g[x].size()) { int to=g[x][i]; if(time[to]==0) { tarjan(to); if(low[to]<low[x]) low[x]=low[to]; } else if(instack[to]&&time[to]<low[x]) low[x]=time[to]; } int to; if(time[x]==low[x]) { cnt++; do{ to=q.top(); q.pop(); instack[to]=0; type[to]=cnt; }while(to!=x); } } void solve() { int i,j; mem(time,0); mem(low,0); mem(instack,0); mem(type,0); cnt=time_num=0; while(!q.empty()) q.pop(); fre(i,1,mn+1) if(time[i]==0) tarjan(i); int ans[N],k; fre(i,1,n+1) { k=0; fre(j,0,g[i].size()) { int to=g[i][j]; if(type[i]!=type[to]) continue; if(to-mn<=m) ans[k++]=to-mn; } sort(ans,ans+k); pf("%d",k); fre(j,0,k) pf(" %d",ans[j]); pf("\n"); } } int main() { int i,j,t,ca=0; sf(t); while(t--) { sff(n,m); mn=max(n,m); fre(i,1,mn*4) g[i].clear(); fre(i,1,n+1) { int k,x; sf(k); while(k--) { sf(x); g[i].push_back(x+mn); } } pf("Case #%d:\n",++ca); xiong(); leave(); solve(); } return 0; }
HDU 4685 Prince and Princess(二分图 + 强连通)
标签:
原文地址:http://blog.csdn.net/u014737310/article/details/44498997