标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 21515 | Accepted: 8455 |
Description
Input
Output
Sample Input
2 3 3 3 1 2 3 2 1 2 1 1 3 3 2 1 3 2 1 3 1 1
Sample Output
YES NO
Source
二分图最大匹配。
邻接矩阵map[i][j]表示j号喜欢i号课程,然后对课程进行寻找匹配,匹配成功则标记,之后统计匹配数目即可。
这题丧心病狂卡时,我改了两天,最后发现I/O超时了。。。 取消同步后的流还是略微慢一些,用标准输入输出可以正好卡过。TAT
1 /* 2 Problem: 3 OJ: 4 User: 5 Time: 6 Memory: 7 Length: 8 */ 9 #include<iostream> 10 #include<cstdio> 11 #include<cstring> 12 #include<cmath> 13 #include<algorithm> 14 #include<queue> 15 #include<cstdlib> 16 #include<iomanip> 17 #include<cassert> 18 #include<climits> 19 #include<vector> 20 #include<list> 21 #include<map> 22 #define maxn 1001 23 #define F(i,j,k) for(int i=j;i<=k;i++) 24 #define M(a,b) memset(a,b,sizeof(a)) 25 #define FF(i,j,k) for(int i=j;i>=k;i--) 26 #define inf 0x7fffffff 27 #define maxm 2016 28 #define mod 1000000007 29 //#define LOCAL 30 using namespace std; 31 int read(){ 32 int x=0,f=1;char ch=getchar(); 33 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} 34 while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} 35 return x*f; 36 } 37 int n,m,p; 38 bool kc[maxn][maxn]; 39 bool vis[maxn]; 40 int pp[maxn]; 41 inline int path(int u) 42 { 43 int a,b,temp; 44 F(i,1,n){ 45 if(kc[u][i]&&!vis[i]){ 46 vis[i]=true; 47 temp=pp[i]; 48 pp[i]=u; 49 if(temp==-1||path(temp)) return 1; 50 pp[i]=temp; 51 } 52 } 53 return 0; 54 } 55 inline int solve() 56 { 57 int a,b,ans=0; 58 M(pp,-1); 59 F(i,1,p){ 60 M(vis,0); 61 // ans+=path(i); 62 if(path(i)) ans++; 63 if(ans==p) break; 64 } 65 return ans; 66 } 67 int main() 68 { 69 int t;cin>>t; 70 while(t--){ 71 scanf("%d", &p);scanf("%d", &n); 72 M(kc,0); 73 int num,cnt; 74 F(i,1,p){ 75 scanf("%d", &num); 76 F(j,1,num){ 77 scanf("%d", &cnt); 78 kc[i][cnt]=true; 79 } 80 } 81 if(solve()==p) printf("YES\n"); 82 else printf("NO\n"); 83 } 84 return 0; 85 }
标签:
原文地址:http://www.cnblogs.com/SBSOI/p/5916326.html