ZOJ 1364 解题报告

ZOJ 1364 解题报告
直观的二分图最大匹配.
Code
 1#include <iostream>
 2using namespace std;
 3
 4int n, m;
 5int **p;
 6bool * visited;
 7int *llink, *rlink;
 8
 9bool match(int pos)
10{
11    for(int i = 0; i < m; ++i)
12    {
13        if(!visited[i] && p[pos][i] == 1)
14        {
15            visited[i] = true;
16            if(rlink[i] == -1 || match(rlink[i]))
17            {
18                rlink[i] = pos;
19                return true;
20            }

21        }

22    }

23    return false;
24}

25
26int _tmain(int argc, _TCHAR* argv[])
27{
28    int jobs;
29    while(cin >> n && n != 0)
30    {
31        cin >> m >> jobs;
32
33        p = new int*[n];
34        for(int i = 0; i < n; ++i)
35        {
36            p[i] = new int[m];
37        }

38
39        int jobId, mode_A, mode_B;
40
41        for(int i = 0; i < jobs; ++i)
42        {
43            cin >> jobId >> mode_A >> mode_B;
44            if(mode_A * mode_B != 0)
45                p[mode_A][mode_B] = 1;
46        }

47
48
49        int result = 0;
50        rlink = new int[m];
51        visited = new bool[m];
52        for(int i = 0; i < m; ++i)
53            rlink[i] = -1;
54
55        for(int i = 0; i < n; ++i)
56        {
57            for(int j = 0; j < m; ++j)
58                visited[j] = false;
59
60            if(match(i))
61                ++result;
62        }

63
64        cout << result << endl;
65        delete llink, rlink, visited;
66        delete [] p;
67    }

68
69    return 0;
70}

71
72

你可能感兴趣的:(ZOJ 1364 解题报告)