hdu 3118

题意:删去最少的边,使图中不存在奇圈。

分析:一开始想用BFS求出哪些点同时存在于两个集合再进行处理,发现行不通。但从数据的范围来看(N≤15,M≤300),这么少的数据可以直接枚举这些点分成两个集合的所有情况,最多2^15种,然后看看哪种情况删除的边数最少的就是答案。

View Code
 1 #include<cstdio>
 2 int t,n,m;
 3 int matrix[16][16];
 4 int solve(int set)
 5 {
 6     int counter=0;
 7     for(int i=0;i<n;i++)
 8     {
 9         if((set&(1<<i))==0)
10         {
11             for(int j=0;j<n;j++)
12             {
13                 if((set&(1<<j))==0)
14                     counter+=matrix[i][j];
15             }
16         }
17     }
18     for(int i=0;i<n;i++)
19     {
20         if((set&(1<<i))!=0)
21         {
22             for(int j=0;j<n;j++)
23             {
24                 if((set&(1<<j))!=0)
25                     counter+=matrix[i][j];
26             }
27         }
28     }
29     return counter/2;
30 }
31 int main()
32 {
33     scanf("%d",&t);
34     while(t--)
35     {
36         scanf("%d%d",&n,&m);
37         for(int i=0;i<n;i++)
38         {
39             for(int j=0;j<n;j++)
40                 matrix[i][j]=0;
41         }
42         for(int i=0;i<m;i++)
43         {
44             int u,v;
45             scanf("%d%d",&u,&v);
46             matrix[u][v]++;
47             matrix[v][u]++;
48         }
49         if(m==0)
50             printf("0\n");
51         else
52         {
53             int min=0xffffff,temp;
54             for(int set=1;set<(1<<n);set++)
55             {
56                 temp=solve(set);
57                 if(temp<min)
58                     min=temp;
59             }
60             printf("%d\n",min);
61         }
62     }    
63     return 0;
64 }

今天这两题给我的教训就是,想得没办法的时候,看看数据大小,确定能否枚举。枚举也是一种方法!

原文地址:https://www.cnblogs.com/ZShogg/p/2964008.html