题意:
给出了男女之间的暧昧关系..求解有多少人之间是没有暧昧关系的..
先给n表示有n个同学
然后 同学a:(暧昧关系人数m) 暧昧关系同学1 暧昧关系同学2 暧昧同学3 ...
思路:
求出最大独立集..
Tips:
有向图:最大独立集 = n-最大匹配
无向图:最大独立集 = n-最大匹配/2
Code:
View Code
1 #include <stdio.h> 2 #include <cstring> 3 #define clr(x) memset(x, 0, sizeof(x)) 4 const int INF = 0x1f1f1f1f; 5 6 struct Edge 7 { 8 int next; 9 int to; 10 }edge[1000000]; 11 int tot; 12 int head[510]; 13 14 void add(int s, int u) 15 { 16 edge[tot].to = u; 17 edge[tot].next = head[s]; 18 head[s] = tot++; 19 } 20 21 int link[510]; 22 int vis[510]; 23 int sum, n; 24 25 int dfs(int x) 26 { 27 for(int i = head[x]; i != -1; i = edge[i].next){ 28 int y = edge[i].to; 29 if(!vis[y]){ 30 vis[y] = true; 31 if(link[y] == 0 || dfs(link[y])){ 32 link[y] = x; 33 return true; 34 } 35 } 36 } 37 return false; 38 } 39 40 void solve() 41 { 42 clr(link); 43 sum = 0; 44 for(int i = 0; i < n; ++i){ 45 clr(vis); 46 if(dfs(i)) 47 sum++; 48 } 49 } 50 51 int main() 52 { 53 int i, j, k; 54 int a, b, m; 55 while(scanf("%d", &n) != EOF) 56 { 57 memset(head, 0xff, sizeof(head)); 58 for(i = 0; i < n; ++i) { 59 scanf("%d: (%d)", &a, &m); 60 while(m--) { 61 scanf("%d", &b); 62 add(a, b); 63 } 64 } 65 66 solve(); 67 68 printf("%d\n", n-sum/2); 69 } 70 return 0; 71 }