##题目大意:
每对由一名中国学生与外国学生组成进行表演,每一位外国同学都可以与其他若干个中国同学很好地配合。如何选择派对,使得能选出最多的派对。
对于给定的外国同学与中国同学的配合情况,编程找出一个最佳派对方案,使得能选出最多的派对。
如果所求的最佳派对方案不存在,则在输出文件写入’NO SOLUTION’。
##解题思路:
最大匹配模版题
匈牙利算法
时
间
复
杂
度
:
O
(
n
³
)
时间复杂度 :O(n³)
时间复杂度:O(n³)
邻
接
表
优
化
后
O
(
n
²
)
邻接表优化后 O(n²)
邻接表优化后O(n²)
##源程序:
[邻接表优化]
#include<cstdio>
#include<cstring>
using namespace std;
struct node{
int x,y,next;
}a[10001];
int n,m,sum,v[10001],list[10001],hk[10001];
bool find(int x){
int t=list[x];
while (t){
if (!v[a[t].y]){
v[a[t].y]=1;
int g=hk[a[t].y];
hk[a[t].y]=x;
if (!g||find(g)) return 1;
hk[a[t].y]=g;
}
t=a[t].next;
}
return 0;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
a[i].next=list[a[i].x];
list[a[i].x]=i;
}
for (int i=1;i<=n;i++)
{
memset(v,0,sizeof(v));
if (find(i)) sum++;
}
if (sum) printf("%d",sum);
else printf("NO SOLUTION");
}