POJ 1466 二分图最大独立集.cpp

本文介绍了一种通过最大匹配算法来求解有向图和无向图中最大独立集的方法,并提供了一个具体的C语言实现代码示例。适用于解决特定类型的图论问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

给出了男女之间的暧昧关系..求解有多少人之间是没有暧昧关系的..

先给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 }

 

 

转载于:https://www.cnblogs.com/Griselda/archive/2012/09/13/2682745.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值