最近学习网络流,作为初学者,向小王同学要来了模板,然后准备A题,第一次看到此题想到的是使用二分图匹配。为了联系网络流的EK算法,拿出来模板开始刷此题。 首先,表示我WA了好多次,由于模板不是我的而出现了错误呀。 #include<stdio.h> #include<memory.h> #include<iostream> using namespace std ; /* 1273 1459 1274 */ /* Hint: gra 数组每次使用需要重新初始化 memset(gra,0,sizeof(gra)); */ const int MAXPT = 501 ; const int MAXNUM = 1000000 ; class MNF_EK { public: int gra[MAXPT][MAXPT]; // 存储图 int n ; // 表示图的顶点个数 - 1 int s,t; // s 为源点 , t 为 汇点 private: int que[10000],rt,ft; int check[MAXPT],pre[MAXPT]; int path() { int u,v; rt=ft=0; memset(check,0,sizeof(check)); check[s]=1; pre[s]=-1; que[rt++]=s; while(rt!=ft) { u=que[ft++]; for(v=0;v<=n;v++) // n 是节点个数减1 if(gra[u][v] && !check[v]) { check[v]=1; pre[v]=u; que[rt++]=v; if(v==t) return 1; } } return 0; } public: MNF_EK(){} ~MNF_EK(){} int EK() { int max=0,min,v; while(path()) { for(v=t,min=MAXNUM;v!=s;v=pre[v]) if(gra[pre[v]][v]<min) min=gra[pre[v]][v]; for(v=t;v!=s;v=pre[v]) { gra[pre[v]][v]-=min; gra[v][pre[v]]+=min; } max+=min; } return max; } } ; int main() { MNF_EK ob ; int n,m; int i,j,tem ; while(cin>>n>>m) { memset( ob.gra , 0 , sizeof(ob.gra ) ); ob.s = 0 ; ob.t = n + m +1 ; ob.n = n + m +1 ; for(i=1;i<=n;i++) { scanf("%d",&j); while(j--) { scanf("%d",&tem); ob.gra[i][tem+n] = 1 ; } } for(i=1;i<=n;i++) ob.gra[ob.s][i] = 1 ; for(i=1;i<=m;i++) ob.gra[n+i][ob.t] = 1; cout<<ob.EK()<<endl; } return 0 ; }