标签:contains sar span 匹配 sam rip roman set match
Time Limit: 5000MS | Memory Limit: 10000K | |
Total Submissions: 12857 | Accepted: 5723 |
Description
Input
Output
Sample Input
7 0: (3) 4 5 6 1: (2) 4 6 2: (0) 3: (0) 4: (2) 0 1 5: (1) 0 6: (2) 0 1 3 0: (2) 1 2 1: (1) 0 2: (1) 0
Sample Output
5 2
翻译:给出n个人,这些人相互之间存在爱情,现在要从这n个人中挑出一个集合,使得集合中的人相互之间都没有爱慕关系,强行让他们都变成单身狗,问这个集合最大的人数。
思路:题意就是最大独立集问题,且最大独立集=V-最大匹配,V是所有顶点的个数,此题中即为n.
AC代码:
#define _CRT_SECURE_NO_DEPRECATE #include<iostream> #include<algorithm> #include<queue> #include<set> #include<vector> #include<cstring> #include<string> using namespace std; #define INF 0x3f3f3f3f const int N_MAX =500; int V;//点的个数 vector<int>G[N_MAX]; int match[N_MAX]; bool used[N_MAX]; void add_edge(int u, int v) { G[u].push_back(v); //G[v].push_back(u); } bool dfs(int v) { used[v] = true; for (int i = 0; i < G[v].size(); i++) { int u = G[v][i], w = match[u]; if (w < 0 || !used[w] && dfs(w)) { match[v] = u; match[u] = v; return true; } } return false; } int bipartite_matching() { int res = 0; memset(match, -1, sizeof(match)); for (int v = 0; v < V; v++) { if (match[v] < 0) { memset(used, 0, sizeof(used)); if (dfs(v)) res++; } } return res; } int main() { int n; while (scanf("%d",&n)!=EOF) { V = n; for (int i = 0; i < n;i++) { int x, n1; scanf("%d: (%d) ",&x,&n1); if (n1)for (int j = 0; j < n1; j++) { int y; scanf("%d",&y); add_edge(x,y); } } printf("%d\n",V-bipartite_matching()); for (int i = 0; i < V;i++) { G[i].clear(); } } return 0; }
标签:contains sar span 匹配 sam rip roman set match
原文地址:http://www.cnblogs.com/ZefengYao/p/7220822.html