http://acm.hdu.edu.cn/showproblem.php?pid=1054 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; #define N 1501 bool h[N]; int pre[N]; int n; int head[N]; struct Node { int v,next; Node(){}; Node(int a,int b):next(a),v(b){}; }E[N*N]; int NE; void insert(int u,int v) { E[NE]=Node(head[u],v); head[u]=NE++; } bool dfs(int u) { for(int i=head[u];i!=-1;i=E[i].next) { int v=E[i].v; if(!h[v]) { h[v]=1; if(pre[v]==-1||dfs(pre[v])) { pre[v]=u; return true; } } } return false; } int atoi(char *p) { int len=strlen(p); int ans=0; for(int i=0;i<len;i++) ans+=(p[i]-'0')*(int)pow(10.0,len-i-1); return ans; } int f(char *ch) { int len=strlen(ch),k=0; char p[20]; for(int i=0;i<len;i++) if(ch[i]=='(') { for(int j=i+1;j<len-1;j++) p[k++]=ch[j]; p[k]='/0'; return atoi(p); } return 0; } int ff(char *p) { int len=strlen(p),k=0;; char ch[20]; for(int i=0;i<len;i++) { if(p[i]==':') break; ch[k++]=p[i]; } ch[k]='/0'; return atoi(ch); } int main(void) { while(~scanf("%d",&n)) { NE=0; memset(head,-1,sizeof(head)); for(int i=0;i<n;i++) { char ch[20]; scanf("%s",ch); int k=ff(ch); int temp=f(ch); while(temp--) { int y; scanf("%d",&y); insert(k,y); insert(y,k); } } memset(pre,-1,sizeof(pre)); int ans=0; for(int i=0;i<n;i++) { memset(h,0,sizeof(h)); if(dfs(i)) ans++; } printf("%d/n",ans/2); } } 用邻接表存,不然会超时!