题目连接:POJ 1325 Machine Schedule
最小点覆盖,注意开始是在零状态,邻接表好快哦,0ms~
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAX_N = 1000 + 50;
const int MAX_M = 100 + 10;
struct Edge
{
int v, next;
};
Edge e[MAX_N];
int head[MAX_M], link[MAX_M], cnt, n, m, k;
bool vis[MAX_M];
void addEdge(int u, int v)
{
e[cnt].v = v;
e[cnt].next = head[u];
head[u] = cnt++;
}
bool DFS(int u)
{
for(int i = head[u]; i != -1; i = e[i].next)
{
if(!vis[e[i].v])
{
vis[e[i].v] = 1;
if(link[e[i].v] == -1 || DFS(link[e[i].v]))
{
link[e[i].v] = u;
return true;
}
}
}
return false;
}
int MaxMatch()
{
int ans = 0;
memset(link, -1, sizeof(link));
for(int i = 0; i < n; i++)
{
memset(vis, 0, sizeof(vis));
if(DFS(i))
ans++;
}
return ans;
}
int main()
{
while(scanf("%d", &n) != EOF && n)
{
scanf("%d%d", &m, &k);
memset(head, -1, sizeof(head));
cnt = 0;
int u, v, num;
for(int i = 0; i < k; i++)
{
scanf("%d%d%d", &num, &u, &v);
if(u == 0 || v == 0)
continue;
addEdge(u, v);
}
printf("%d\n", MaxMatch());
}
return 0;
}