题目来源:https://vjudge.net/problem/HDU-1083
题意
存在P门课程,从N个人里选出P个课代表,并且不能选相同的人。问是否可以选出?是输出YES,不能输出NO。
思路
用课程去匹配和课程本身有关系的人,若匹配不到,说明不行。
代码
#include<cstdio>
#include<vector>
#include<map>
#include<stack>
#include<cstring>
#include<algorithm>
using namespace std;
int p,n;
int first[1000];
int parent[3100];
struct pp
{
int to,next;
} edge[30000+10];
bool vis[3000+10];
bool dfs(int x)
{
for(int i=first[x]; i!=-1; i=edge[i].next)
{
int w=edge[i].to;
if(!vis[w])
{
vis[w]=1;
if(!parent[w]||dfs(parent[w]))
{
parent[w]=x;
vis[w]=0;
return 1;
}
}
}
return 0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&p,&n);
if(n<p)
{
printf("NO\n");
continue;
}
int tot=0;
for(int i=1; i<=p; i++)
{
first[i]=-1;
int x,y;
scanf("%d",&x);
while(x>0)
{
scanf("%d",&y);
edge[tot].to=y;
edge[tot].next=first[i];
first[i]=tot++;
x--;
}
}
int flag=0;
memset(parent,0,sizeof(parent));
memset(vis,0,sizeof(vis));
for(int i=1; i<=p; i++)
{
if(!dfs(i))
{
flag=1;
break;
}
}
if(flag) printf("NO\n");
else printf("YES\n");
}
}
二维矩阵:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=500;
int n,p;
int mp[maxn][maxn],vis[maxn],pre[maxn];
int dfs(int i)
{
for(int j=1; j<=n; j++)
{
if(mp[i][j]&&!vis[j])
{
vis[j]=1;
if(pre[j]==-1||dfs(pre[j]))
{
vis[j]=0;
pre[j]=i;
return 1;
}
}
}
return 0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(mp,0,sizeof(mp));
scanf("%d%d",&p,&n);
for(int i=1; i<=p; i++)
{
int num,x;
scanf("%d",&num);
while(num--)
{
scanf("%d",&x);
mp[i][x]=1;
}
}
memset(pre,-1,sizeof(pre));
memset(vis,0,sizeof(vis));
int ret=0;
for(int i=1; i<=p; i++)
ret+=dfs(i);
if(ret==p)
printf("YES\n");
else printf("NO\n");
}
}
//千万不要把n和p写反了,,,找了半天bug。。。