ACM: 图论题 poj 1466 最大独立团
2016-05-19 23:26
363 查看
Girls and
Boys
Description
In the second year of the
university somebody started a study on the romantic relations
between the students. The relation "romantically involved" is
defined between one girl and one boy. For the study reasons it is
necessary to find out the maximum set satisfying the condition:
there are no two students in the set who have been "romantically
involved". The result of the program is the number of students in
such a set.
Input
The input contains several data
sets in text format. Each data set represents one set of subjects
of the study, with the following description:
the number of students
the description of each student, in the following format
student_identifier:(number_of_romantic_relations)
student_identifier1 student_identifier2 student_identifier3
...
or
student_identifier:(0)
The student_identifier is an integer number between 0 and n-1 (n
<=500 ), for n subjects.
Output
For each given data set, the
program should write to standard output a line containing the
result.
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
题意: 男生和女生组合, 求出独立的人的个数.
解题思路:
1.
最大独立团公式: result = n-最大匹配/2
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define MAX 501
int n;
int x[MAX], y[MAX];
bool g[MAX][MAX], vis[MAX];
bool find(int u)
{
for(int v = 0; v < n; ++v)
{
if( g[u][v]
&& !vis[v] )
{
vis[v] =
true;
if( y[v] ==
-1 || find(y[v]) )
{
y[v]
= u;
return
true;
}
}
}
return false;
}
int Edmonds()
{
int result = 0;
memset(y, -1, sizeof(y));
for(int u = 0; u < n; ++u)
{
memset(vis, false,
sizeof(vis));
if( find(u) ) result++;
}
return result;
}
int main()
{
// freopen("input.txt", "r", stdin);
while(scanf("%d", &n) !=
EOF)
{
int u, v, num;
memset(g, false,
sizeof(g));
for(int i = 0; i
< n; ++i)
{
scanf("%d:
(%d)", &u, &num);
for(int j =
0; j < num; ++j)
{
scanf("%d",
&v);
g[u][v]
= true;
}
}
printf("%d\n",
n-Edmonds()/2);
}
return 0;
}
Boys
Description
In the second year of the
university somebody started a study on the romantic relations
between the students. The relation "romantically involved" is
defined between one girl and one boy. For the study reasons it is
necessary to find out the maximum set satisfying the condition:
there are no two students in the set who have been "romantically
involved". The result of the program is the number of students in
such a set.
Input
The input contains several data
sets in text format. Each data set represents one set of subjects
of the study, with the following description:
the number of students
the description of each student, in the following format
student_identifier:(number_of_romantic_relations)
student_identifier1 student_identifier2 student_identifier3
...
or
student_identifier:(0)
The student_identifier is an integer number between 0 and n-1 (n
<=500 ), for n subjects.
Output
For each given data set, the
program should write to standard output a line containing the
result.
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
题意: 男生和女生组合, 求出独立的人的个数.
解题思路:
1.
最大独立团公式: result = n-最大匹配/2
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define MAX 501
int n;
int x[MAX], y[MAX];
bool g[MAX][MAX], vis[MAX];
bool find(int u)
{
for(int v = 0; v < n; ++v)
{
if( g[u][v]
&& !vis[v] )
{
vis[v] =
true;
if( y[v] ==
-1 || find(y[v]) )
{
y[v]
= u;
return
true;
}
}
}
return false;
}
int Edmonds()
{
int result = 0;
memset(y, -1, sizeof(y));
for(int u = 0; u < n; ++u)
{
memset(vis, false,
sizeof(vis));
if( find(u) ) result++;
}
return result;
}
int main()
{
// freopen("input.txt", "r", stdin);
while(scanf("%d", &n) !=
EOF)
{
int u, v, num;
memset(g, false,
sizeof(g));
for(int i = 0; i
< n; ++i)
{
scanf("%d:
(%d)", &u, &num);
for(int j =
0; j < num; ++j)
{
scanf("%d",
&v);
g[u][v]
= true;
}
}
printf("%d\n",
n-Edmonds()/2);
}
return 0;
}
相关文章推荐
- ACM: 图论题 poj 1…
- 图论: 差分约束系统
- ACM: 图论题 poj 1275 差分约束题
- ACM: 图论题 poj 1236 强连通
- ACM: 图论题 poj 1149 网络流问题
- ACM: 图论题 poj 1201 差分约束
- ACM: 搜索题 poj 1020
- ACM: 图论题 poj 3308 最大流问题
- Android的自定义控件起步
- ACM: 图论题 poj 3177 同 3352
- dos批处理中%~dp0%的说明
- ACM: 图论题 poj 2186 强连通分量
- ACM: 博弈题 poj 1143 状态压缩
- 本周学习的代码(数构 深度 广度 优先遍历)
- [原创]关于设置linux中vim 显示行号
- ACM: 动态规划题 poj&nb…
- ACM: 图论题 poj 3…
- 兴趣学习: opencv 实现画图程序
- 兴趣学习: opencv -- 视频读写, 鼠…
- ACM: 动态规划题 poj 2923