POJ-1325-Machine Schedule

第一次做二分图匹配的题~这个题也就是说求最小点覆盖,也就是找最大的二分图匹配~

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
using namespace std;
const int maxn=1001;
vector<int> e[maxn];
int n,m,k;
int mk[101];
bool vis[101];
bool DFS(int u)
{
    for(int i=0;i<e[u].size();i++)
    {
	int v=e[u][i];
	if(!vis[v])
	{
	    vis[v]=1;
	    if(mk[v]==-1||DFS(mk[v]))
	    {
		mk[v]=u;
		return 1;
	    }
	}
    }
    return 0;
}
int main()
{
    while(scanf("%d",&n)&&n)
    {
	scanf("%d%d",&m,&k);
	for(int i=0;i<=n;i++)
	    e[i].clear();
	for(int i=0;i<k;i++)
	{
	    int ita,itb,itc;
	    scanf("%d%d%d",&ita,&itb,&itc);
	    if(itb*itc==0)
		continue;
	    e[itb].push_back(itc);
	}
	memset(mk,-1,sizeof(mk));
	int ans=0;
	for(int i=1;i<=n;i++)
	{
	    memset(vis,0,sizeof(vis));
	    if(DFS(i))
		ans++;
	}
	printf("%d\n",ans);
    }
    return 0;
}


你可能感兴趣的:(二分图)