hdu----(3118)Arbiter(构造二分图)

Arbiter

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 800    Accepted Submission(s): 410

Problem Description

Arbiter
is a kind of starship in the StarCraft science-fiction series. The
Arbiter-class starship is a Protoss warship specializing in providing
psychic support. Arbiters were crewed exclusively by Judicators; unlike
other warships that were manned predominantly by Templar. The Judicator
used the Arbiter as a base to provide support using space-time
manipulation.
Arbiters could weaken space-time, tearing rifts in the
fabric of space-time, creating a vortex linking another location to the
Arbiter’s location. This could be used to move personnel over long
distances between stars.
In the meantime of widely used Arbiter to
transfer, KMXS, the captain of one Arbiter, was warning that some person
had got a serious mental disorder after the trip on his Arbiter. By
using mice as model animals, he found the sake, it’s because of
chirality!
Every person has chirality, either left-handed or
right-handed. Actually all the persons must live with the food which has
the same chirality. When one person took Arbiter from one star to
another one, his chirality will be changed (from left-handed to
right-handed or from right-handed to left-handed). If a person took a
long trip and finally got back to his own star, however, his chirality
might be changed to the opposite state other than his original, which
would cause fatal mental disorder, or even death.
KMXS has the
channels map among the starts and he need to prohibit minimum number of
channels from traveling so that wherever a person starts his traveling
from when he gets his original star he’ll be safe. KMXS turns to your
help.

Input

The first line of input consists of an integer T, indicating the number of test cases.
The
first line of each case consists of two integers N and M, indicating
the number of stars and the number of channels. Each of the next M lines
indicates one channel (u, v) which means there is a bidirectional
channel between star u and star v (u is not equal to v).

Output

Output
one integer on a single line for each case, indicating the minimum
number of channels KMXS must prohibit to avoid mental disorder.

Constraints
0 < T <= 10
0 <= N <= 15 0 <= M <= 300
0 <= u, v < N and there may be more than one channel between two stars.

Sample Input

1
3 3
0 1
1 2
2 0

Sample Output

1

Source

2009 Asia Wuhan Regional Contest Online

这道题的意思:

Arbiter

“仲裁者”是《星际争霸》科幻系列中的一种太空船。仲裁者级太空船是神族的战船,专门提供精神力支援。不像其他战船的人员主要是战士阶级,仲裁者所承载的都是统治阶级。统治者以仲裁者为基地,用时空操控来提供支援。

仲裁者可以克服时空限制,撕裂时空,产生裂缝,制造涡洞,把另一个空间连接到仲裁者所在空间,可以用来运送人员,跨越长途星际。

正当仲裁者广泛用于运输的时候,一艘仲裁者的船长 KMXS 发出警告,有些人员在他的船上完成旅程之后,得到严重的精神错乱。他用小白鼠做动物实验,找到了原因,是生物化学中的“手性”!

每个人 都有手性,是左手性或者右手性。事实上,所有人的生存都必须依靠相同手性的食物。一个人乘坐仲裁者从一个星球到另一个星球的时候,他的手性会改变,(从左 手性变成右手性,或者从右手性变成左手性。)如果一个人经过长途旅行,最后回到自己的星球,可是他的手性却可能改变成跟原来的相反,那就会造成致命的精神 错乱,甚至死亡。 

KMXS 拥有星球之间的航道图。他需要禁止通过航道的最少数目,以致无论一个人从哪里出发,当他回到自己的星球,会是安全的。KMXS请求你的帮助。

Input

  第一行输入有一个整数 T,表示测试用例的数目。

  每个用例的第一行有两个整数 N 和 M,表示星球的数目和航道的数目。随后的 M 行表示航道,每个 (u, v) 代表在星球 u 和星球 v 之间有一条双向的航道(u 不等于 v)。

Output

每个测试用例的结果输出一行,用一个整数表示KMXS为了要避免人们精神错乱, 必须禁止的最少航道数目。

Constraints

0 < T <= 10

0 <= N <= 15 0 <= M <= 300

0 <= u, v < N在两个星球之间可以有超过一条航道

Sample Input

13 30 11 22 0

Sample Output

1

很明显: 这个意思是,可以从任意一个星球,到大另一个星球,但是每个星球都有手性.....

要我们求出,对于任何一个星球出发都不能通过奇数次传递回到该星球...也就是不能形成奇数环..

而我们知道,二分图的充要条件是: 至少存在两个顶点,每一个点的回路的长度都是偶数...

所以只需进行擦边,来构成二分图就可以了.,...

代码:

 1 #include<cstring>
 2 #include<cstdio>
 3 const int maxn=305;
 4 int aa[maxn],bb[maxn];
 5 int n,m;
 6 int main(){
 7   int test;
 8   //freopen("test.in","r",stdin);
 9   scanf("%d",&test);
10   while(test--){
11    scanf("%d%d",&n,&m);
12     for(int i=0;i<m;i++){
13       scanf("%d%d",aa+i,bb+i);
14     }
15     int ans=m+2;
16    for(int i=0;i<(1<<n);i++)   //2^n种情况,对于每一个星球都可以两种情况要么为左,要么为右
17    {
18         int cnt=0;
19         for(int j=0;j<m;j++){
20             if(((i>>aa[j])%2)==((i>>bb[j])%2))  //属于同一个世界,说明呵呵存在奇数环
21                cnt++;
22      }
23        if(ans>cnt)ans=cnt;
24    }
25      printf("%d\n",ans);
26   }
27  return 0;
28 }

时间: 2024-10-16 09:29:45

hdu----(3118)Arbiter(构造二分图)的相关文章

HDU 3118 Arbiter 判定奇圈

题目来源:HDU 3118 Arbiter 题意:翻译过来就是不能有奇圈 每走一步状态会变化 当他回到起点时如果和原来的状态不一样 可能会死 求至少去掉多少条边可以避免这种状况发生 思路:二分图是没有奇圈的 最多就15个点 我们用状态压缩枚举那些点是在二分图的一边和另外一边 确定二分图之后枚举输入的边 每条边连接的不能是同一集合的点 不符合就去掉 最后取小 #include <cstdio> #include <cstring> #include <cstdlib> #

hdu 3118 Arbiter

http://acm.hdu.edu.cn/showproblem.php?pid=3118 题意:删除最少的边使图没有奇环 二分图的定义:如果顶点能分为两个互不相交的子集,则图为二分图 二分图的判定:如果二分图能黑白染色成功,则图为二分图 而黑白染色,其实就是判断环是奇环还是偶环 如果是奇环,一定会有黑黑或白白相撞 所以删除最小的边使图没有奇环,就是使图能够黑白染色 也就是删除最少的边,使图变成一个二分图 n只有15 完全可以枚举左边有哪些点,右边有哪些点 因为二分图的两个点集互不相交 所以两

HDU 3605 Escape【二分图多重匹配】

题意: 有n个人去m个星球  告诉你每个人想去哪些星球和每个星球最多容纳多少人,问能不能让所有人都满足 分析: 二分图多重匹配 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 using namespace std; 6 7 const int maxn = 100005; 8 const int maxm = 15; 9 10

hdu 1150 Machine Schedule(二分图-最小顶点覆盖)

Machine Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5424    Accepted Submission(s): 2691 Problem Description As we all know, machine scheduling is a very classical problem in compu

hdu 4751 Divide Groups 二分图

题意给出所有人之间的关系,单向的,问能不能将这群人分成两组,使得每组内部的任意两人都互相认识. 先把单向边都换成无向边,即如果a,b互相认识那么不变,如果只是单向边的话那么则认为他们两个不认识,然后假设能分成满足题意的两个集合,那么新图的补图中这两个集合内部是没有边的,所以只要判断补图是不是二分图即可. #include <cstdio> #include <cstring> #include <queue> using namespace std; int G[210

【题解】CF739D Recover a functional graph(构造+二分图匹配)

[题解]CF739D Recover a functional graph(构造+二分图匹配) 题目大意 一个图被称为F图当且仅当每个点出度为1.可以发现这个图是一个内向基环森林,给出所有点到它能到达的环(只会有一个)的距离dis和那个环的长度len,然而有些点的信息模糊了,用?代替,可以是任何数.现在你要输出一个合法的构造方案. 可以提炼出一个图是F图的条件: 对应环的距离数组是自然数数列 \(len=k\)的点的个数是\(tk,t\in N^+\) 由于第二个条件只能用问号补,没有决策需要做

2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6150 Vertex Cover 二分图,构造

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6150 题意:"最小点覆盖集"是个NP完全问题 有一个近似算法是说-每次选取度数最大的点(如果有多个这样的点,则选择最后一个) 让你构造一个图,使得其近似算法求出来点数是你给定的覆盖点数的至少3倍. 解法: 可以把左边的点编号1~n,将左边的点进行n次分块,第i次分块中每块的大小为i,对于每一块的点,都在右边创建一个新节点与这些点相连. ①右边的点的度数为n,n-1,n-2,...,n/2,

hdu 1054 Strategic Game 二分图最小点覆盖

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1054 题意: 给出一个无向图,求最小点覆盖. 思路: 用网络流来做设立一个超级源点和一个超级汇点. 每个点拆成i和i'. 从超级源点向点i连一条边,容量为1. 从i’向超级汇点连一条边,容量为1. 从i向i'连一条边,容量为正无穷. 然后求最小割/2.因为拆点拆成了2个. 也可以用二分图匹配来做,也是求出最大匹配然后/2. 1 #include <bits/stdc++.h> 2 using na

hdu 4850 字符串构造---欧拉回路构造序列 递归+非递归实现

http://acm.hdu.edu.cn/showproblem.php?pid=4850 题意:构造长度为n的字符序列,使得>=4的子串只出现一次 其实最长只能构造出来26^4+4-1= 456979 的序列,大于该数的都是不可能的.构造方法,就是那种欧拉回路的序列,此题DFS会爆栈,手动扩展栈也可以AC...... 递归形式的开始WA了,没有细调就换非递归了,后来又想了想,虽然自己电脑上运行不了,但是先把长度按小的来,然后调试代码,然后在扩大,AC了,当时错在MOD,递归的MOD应该是26