百度之星 星球大战

星球大战

公元 4999 年,人

类科学高度发达,绝大部分人都已经移居至浩瀚的宇宙,在上千颗可居住星球上留下了人类的印记。然而,此时人类却分裂成了两个联盟:正义联盟和邪恶联盟。两个联盟之间仇恨难解,时有战争。

现在,正义联盟计划要破坏邪恶联盟的贸易网络,从而影响邪恶联盟的经济状况,为下一次战争作好准备。邪恶联盟由数百颗星球组成,贸易通过星球间的运输航道来完成。一条运输航道是双向的且仅连接两个星球,但两个星球之间可以有多条航道,也可能没有。两个星球之间只要有运输航道直接或间接的相连,它们就可以进行贸易。正义联盟计划破坏邪恶联盟中的一些运输航道,使得邪恶联盟的星球分成两部分,任一部分的星球都不能与另一部分的星球进行贸易。但是为了节省破坏行动所需的开支,正义联盟希望破坏尽量少的运输航道来达成目标。请问正义联盟最少需要破坏多少条运输航道呢?

输入格式:

输入文件包含多组测试数据。每组测试数据第一行为两个整数 N 和 M ( 2 ≤ N ≤500 , 0≤M≤N(N-1)/2 ), N 为邪恶联盟中星球的数量。接下来 M 行,每行三个整数 A 、 B 和 C ( 0 ≤A , B<N , A≠B , C>0 ),表示星球 A 和星球 B 之间有 C 条运输航道。运输航道的总数量不超过 10 8 。

输出格式:

每组测试数据输出一行,包含一个整数,表示需要破坏的运输航道的数量。

如果输入的贸易网络本来就是不连通的,则输出 0 。

输入00样例:

3 3

0 1 1

1 2 1

2 0 1

4 3

0 1 1

1 2 1

2 3 1

8 14

0 1 1

0 2 1

0 3 1

1 2 1

1 3 1

2 3 1

4 5 1

4 6 1

4 7 1

5 6 1

5 7 1

6 7 1

4 0 1

7 3 1

输出样例:

2

1

2

说明:

共有 5 个测试数据集,每个测试数据集为一个输入文件,包含多组测试数据。每个测试数据集从易到难分别为 5 、 10 、 15 、 30 和 40 分,对每个测试数据集分别执行一次程序,每次必须在运行时限 10 秒内结束程序并输出正确的答案才能得分。

所有数据均从标准输入设备( stdin/cin )读入,并写出到标准输出设备 ( stdout/cout )中。

五个测试数据集中输入 N 分别不大于 20 、 50 、 100 、 200 和 500 ,各有 9 组测试数据。

 

 #include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

#define INF 10000

 

void main()

{

         int m,n;

 

         int i,j;

         int b1,b2,b3;

 

         scanf("%d%d",&m,&n);

 

         int **a=(int **)malloc(sizeof(int *)*m);

 

         for(i=0;i<m;i++)

                   a[i]=(int *)malloc(sizeof(int )*m);

 

         for(i=0;i<m;i++)

                   for(j=0;j<m;j++)

                   {

                            if(i==j)

                                     a[i][j]=0;

                            else

                            a[i][j]=INF;

                   }

 

                   for(i=0;i<n;i++)

                   {

                            scanf("%d%d%d",&b1,&b2,&b3);

                            a[b1][b2]=b3;

                            a[b2][b1]=b3;

 

                   }

 

/*                for(i=0;i<m;i++)

                   {

                            for(j=0;j<m;j++)

                                     printf("%d    ",a[i][j]);

                            printf("\n");

                   }*/

 

 

         int min=1000;

                   int count=0;

       

                   for(i=0;i<m;i++)

                   {

                            for(j=0;j<m;j++)

                            {

                                     if(i!=j&&a[i][j]!=INF)

                                     count++;

 

                            }

                            if(count<min)

                                     min=count;

                            count=0;

 

                  

                   }

         //       printf("%d\n",min);

 

 

 

 

}

 

posted on 2014-02-12 19:15  朱涵友  阅读(216)  评论(0)    收藏  举报

导航