|
Posted on 2009-08-28 10:35 reiks 阅读(602) 评论(0) 编辑 收藏 引用 所属分类: 算法与数据结构
#include<iostream> bool map[102][302],use[302]; int link[302],n,m; bool dfs(int); int main() { int t,v,i,j,x,num; scanf("%d",&t); while (t--) { scanf("%d%d",&n,&m); i=1; while (i<=n) { j=1; while (j<=m) map[i][j++]=0; i++; }
// m ->人 n ->课程 i=1; while (i<=m) link[i++] = -1; i=1;
while (i<=n) { scanf("%d",&v); j=0; while (j<v) { scanf("%d",&x); map[i][x]=1; j++; } i++; } num=0; i=1; while (i<=n) { j=1; while (j<=m) use[j++]=0; if (dfs(i)) num++; i++; } if (num==n) printf("YES\n"); else printf("NO\n"); } return 0; }
bool dfs(int x) { int i,j; i=1; while (i<=m) { if (use[i]==0&&map[x][i]) { use[i]=1; j=link[i]; link[i]=x; if (j==-1||dfs(j)) { return true; } link[i]=j; } i++; } return false; } ============================================
#include <memory.h> #include <stdio.h> //分别定义左右最大元素 #define LEFT_MAX 501 #define RIGHT_MAX 501
bool useif[RIGHT_MAX]; //link[]记录与右边元素连接的元素,-1表示没有连接 int link[RIGHT_MAX];
int left_num,right_num;
bool array[LEFT_MAX][RIGHT_MAX];
bool can(int t) { int i; for(i=0;i<right_num;i++) { if(!useif[i]&&array[t][i]) { useif[i]=true; if(link[i]==-1||can(link[i])) { link[i]=t; return true; } }
} return false; }
int main() { int i,k,num,temp,num_of_this; char c; //scanf("%d\n",&count); //for(j=0;j<count;j++) while(scanf("%d",&left_num)!=-1) { right_num=left_num; //link??-1 memset(link,0xFF,sizeof(link)); memset(array,0,sizeof(array)); memset(useif,0,sizeof(useif)); num=0; for(i=0;i<left_num;i++) { scanf("%d%c%c%c%d%c",&temp,&c,&c,&c,&num_of_this,&c); for(k=0;k<num_of_this;k++) { scanf("%d",&temp); array[i][temp]=true; } } //匹配,num为结果 for(i=0;i<left_num;i++) { memset(useif,0,sizeof(useif)); if(can(i)) num++; }
printf("%d\n",left_num-num/2); } return 1; }
|