Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1888 Accepted Submission(s): 848
//利用最大流写的二分匹配算法,初试、时间上挺慢、不过很开心呀、、自己的第一个二分匹配算法、
//呵呵,对于二分图图、要自己给定一个起点和一个终点,然后求最大流、呵呵
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <algorithm>
#define V 403
#define inf 13
using namespace std;
int f[V][V],c[V][V];
int main()
{
int P,N,T,M;
int fa[V],r[V];
int sum;
int i,j,u,v,co;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&P,&N);
memset(f,0,sizeof(f));
memset(c,0,sizeof(c));
for(i=1;i<=P;i++)
{
c[0][i]=1;
scanf("%d",&co);
for(j=0;j<co;j++)
{
scanf("%d",&u);
c[i][P+u]=1;
}
}
M=P+N+1;
for(i=1;i<=N;i++)
{
c[i+P][M]=1;
}
sum=0;
for(;;)
{
memset(r,0,sizeof(r));
queue<int> Q;
r[0]=inf;
Q.push(0);
while(!Q.empty())
{
u=Q.front();Q.pop();
for(v=1;v<=M;v++)
if(!r[v]&&c[u][v]>f[u][v])
{
r[v]=r[u]<=c[u][v]-f[u][v]?r[u]:c[u][v]-f[u][v];
fa[v]=u;
Q.push(v);
}
}
if(r[M]==0)
break;
for(u=M;u!=0;u=fa[u])
{
f[fa[u]][u]+=r[M];
f[u][fa[u]]-=r[M];
}
sum+=r[M];
}
if(sum==P)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
//对早上的这题时间很不满意呀、4000+MS,去学了下匈牙利算法,156Ms、差别还真大、而且用的内存和代码长度都更
//少
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <algorithm>
#define L 103
#define R 303
using namespace std;
bool map[L][R],v[R];
int match[R];
int P,N,T;
bool DFS(const int &k)//真是短小精悍的东西呀
{
for(int i=1;i<=N;i++)
if(map[k][i]&&!v[i])
{
v[i]=1;
if(match[i]==0||DFS(match[i]))
{
match[i]=k;
return 1;
}
}
return 0;
}
int main()
{
int i,j,k,t;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&P,&N);
memset(map,0,sizeof(map));
for(i=1;i<=P;i++)
{
scanf("%d",&t);
for(j=0;j<t;j++)
scanf("%d",&k),map[i][k]=1;
}
k=0;
memset(match,0,sizeof(match));
for(i=1;i<=P;i++)
{
memset(v,0,sizeof(v));
if(DFS(i)) k++;
}
if(k==P)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}