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