这道题就是求最小顶点覆盖,其中要注意的是,当有一个任务可以用mode 0来实现的,就可以不加边,因为不需要重启!先把0的都做完,再换机器,就相当于没有0的这个要求了,因此,忽略mode 0可以做的任务。
开门红!Yes!
代码:
#include <cstdio>
#include <cstring>
const int N = 110;
int ln, rn, k, bmap[N][N], cy[N];
bool vis[N];
bool dfs( int u )
{
for ( int v = 0; v < rn; ++v ) if ( bmap[u][v] && !vis[v] ) {
vis[v] = true;
if ( cy[v] == -1 || dfs( cy[v] ) ) {
cy[v] = u;
return 1;
}
}
return 0;
}
int match()
{
int res = 0;
memset(cy, -1, sizeof(cy));
for(int i = 0; i < ln; ++i ) {
memset( vis, 0, sizeof(vis));
if ( dfs(i) ) res++;
}
return res;
}
int main()
{
while ( scanf("%d", &ln) != EOF && ln ) {
scanf("%d%d", &rn, &k);
memset( bmap, 0, sizeof(bmap) );
while ( k-- ) {
int i, x, y;
scanf("%d%d%d", &i, &x, &y);
if ( x != 0 && y != 0 ) bmap[x][y] = 1;
}
printf("%d\n", match());
}
}