【UVA1194】Machine Schedule

题目大意:给定 N 个任务和两台机器,每个任务可以在任意一台机器上执行,每台机器有 N 个启动状态,不同任务需要机器在不同的状态下执行,求执行所有任务需要多少个不同的状态。

题解:由于一个任务一定要被两台机器中的一台执行,可以将任务看作边,连接两台机器的对应启动状态。所要求的是这个二分图的最大独立集,因此,只需求出其最大匹匹数即可。

代码如下

#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) x.begin(),x.end()
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int dx[]={0,1,0,-1};
const int dy[]={1,0,-1,0};
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
//const int maxn=
const double eps=1e-6;
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll sqr(ll x){return x*x;}
inline ll read(){
	ll x=0,f=1;char ch;
	do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
	do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
	return f*x;
}
/*--------------------------------------------------------*/

vector<int> G[101];
int match[101];bool vis[101];
int n,m,q,ans;

void read_and_parse(){
	m=read(),q=read();
	for(int i=1;i<=q;i++){
		int d=read(),x=read(),y=read();
		G[x].pb(y);
	}
}

bool dfs(int u){
	for(auto v:G[u])if(!vis[v]){
		vis[v]=1;
		if(!match[v]||dfs(match[v])){
			match[v]=u;return 1;
		}
	}
	return 0;
}

void solve(){
	for(int i=1;i<=n;i++){
		memset(vis,0,sizeof(vis));
		if(dfs(i))++ans;
	}
	printf("%d
",ans);
}

void init(){
	ans=0;
	for(int i=1;i<=100;i++)G[i].clear();
	memset(match,0,sizeof(match));
}

int main(){
	while(n=read()){
		init();
		read_and_parse();
		solve();
	}
	return 0;
}

原文地址:https://www.cnblogs.com/wzj-xhjbk/p/10641660.html