【二分图裸题】poj1325机器调度
题目大意:有两个机器A和B,A机器有n个模式,B机器有m个模式,两个机器最初在0模式
然后有k个作业,每个作业有三个参数i,a,b
i代表作业编号,a和b代表第i作业要么在A机器的a模式下完成【或者】在B机器的b模式下完成
问两个机器总共最少变换多少次可以完成所有作业
简单的二分图裸题,但是要注意使用邻接表的时候加上对于b机器初始模式0的判断
而且题上还有数据的问题,有一个点k的值比题中描述大(我开5000过的)
#include<iostream> #include<cstdio> #include<cstring> using namespace std; struct edge{ int y,next; }e[5001]; int n,m,k,a,b,c,ecnt,ans; int head[201],point[201]; bool used[201]; void add(int a,int b) { e[++ecnt].y=b; e[ecnt].next=head[a]; head[a]=ecnt; } bool find(int x) { for(int i=head[x];i;i=e[i].next){ if(used[e[i].y]==0&&e[i].y!=0) { used[e[i].y]=1; if(point[e[i].y]==0||find(point[e[i].y])) { point[e[i].y]=x; return 1; } } } return 0; } int main() { freopen("machine.in","r",stdin); freopen("machine.out","w",stdout); scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=k;++i) { scanf("%d%d%d",&a,&b,&c); add(b,c); } ans=0; memset(point,0,sizeof(point)); for(int i=1;i<=n;++i){ memset(used,0,sizeof(used)); if(find(i))ans++; } printf("%d",ans); }