您的位置:首页 > 其它

poj - 1325 - Machine Schedule(二分图最大匹配)

2013-04-03 01:04 369 查看
题意:A机器有n种作业模式,B机器有m种作业模式,任务i可由A的x模式完成,也可由B的y模式完成,开始时A、B都处在模式0,每切换一种模式都要重启一次机器,问完成k项任务最少需要重启几次机器。

题目链接:http://poj.org/problem?id=1325

——>>将模式看成点,任务看成线,每选一点,与该点为端点的连线就会被吃掉(盖掉),即求最少取多少个点能把所有的线盖掉,实际上就是求二分图的最大匹配数。

~~~由于机器开始时处在模式0,所以与模式0相连的线都不要保存到图中,因为肯定不用重启机器就可将其完成,所以建图时直接不要0点。

#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;

const int maxn = 200 + 10;
vector<int> G[maxn];
bool vis[maxn];
int fa[maxn];

bool dfs(int u)
{
int d = G[u].size();
for(int i = 0; i < d; i++)
{
int v = G[u][i];
if(!vis[v])
{
vis[v] = 1;
int temp = fa[v];
fa[v] = u;
if(temp == -1 || dfs(temp)) return 1;
fa[v] = temp;
}
}
return 0;
}
int main()
{
int n, m, k, i, j, x, y;
while(~scanf("%d", &n))
{
if(!n) return 0;
scanf("%d%d", &m, &k);
int sum = n + m;
for(i = 0; i < maxn; i++) G[i].clear();
for(j = 0; j < k; j++)
{
scanf("%d%d%d", &i, &x, &y);
if(x && y)
{
G[x].push_back(y+n);
G[y+n].push_back(x);
}
}
memset(fa, -1, sizeof(fa));
for(i = 0; i < sum; i++)
{
memset(vis, 0, sizeof(vis));
dfs(i);
}
int cnt = 0;
for(i = 0; i < sum; i++)
if(fa[i] != -1) cnt++;
printf("%d\n", cnt / 2);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: