码迷,mamicode.com
首页 > 其他好文 > 详细

poj——3118 Arbiter

时间:2017-08-26 21:23:49      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:情况   span   偶数   需要   const   表示   双向   ++   用例   

            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
 
最后一道二分图的题。
思路:(看不懂题目,然后看的题解才懂得·、、)
如果一个人·经过n个航道,然后回到自己后手性会发生改变,那么便会精神错乱。我们求不会发生精神错乱最少要删掉的边数。
什么情况下会发生精神错乱?? 通过题目可以知道每经过一个航道,手性会发生一次改变,也就是说我们当经过奇数次航道再回到本地是就会发生精神错乱。那么这个题也就是让我们求我们删掉多少条边后使图中不存在奇圈。
什么是奇圈?

1,如果一个强连通分量内的某些顶点在一个集圈内(即某些强通分量内含有奇圈),那么强连通分量中的其它顶点也在某个奇圈内。  

      第一个条件的证明:我们假设有一个奇圈,因为是点双,没有割点,必然有紧挨着的圈,假设这个是偶数圈,则,这个偶数圈必然能和原来的奇圈组成新的奇圈(因为:新的圈=(奇数圈-k)+(偶数圈-k)=奇数+偶数-偶数=奇数,k是共同边上的点数

2.如果一个双联通分量含有奇圈,着他必定不是一个二分图。反过来也成立,这是一个充要条件。

这样的话我们又可以转化成删掉多少条边后这个图就可以变成二分图。

代码:
(不做了,粘个代码看看吧。。。)
#include<cstring>
#include<cstdio>
const int maxn=305;
int n,m,test,aa[maxn],bb[maxn];
int main()
{
      scanf("%d",&test);
      while(test--)
      {
           scanf("%d%d",&n,&m);
            for(int i=0;i<m;i++)
              scanf("%d%d",aa+i,bb+i);
           int ans=maxn;
           for(int i=0;i<(1<<n);i++)   //2^n种情况,对于每一个星球都可以两种情况要么为左,要么为右
           {
                int cnt=0;
                for(int j=0;j<m;j++)
                   if(((i>>aa[j])%2)==((i>>bb[j])%2))  //属于同一个世界,说明呵呵存在奇数环
                     cnt++;
               if(ans>cnt) ans=cnt;
           }
             printf("%d\n",ans);
      }
     return 0;
}

 

poj——3118 Arbiter

标签:情况   span   偶数   需要   const   表示   双向   ++   用例   

原文地址:http://www.cnblogs.com/z360/p/7436288.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!