hdu 2489 枚举m个点求最小生成树 2008 asia beijing regional contest

!A的感觉真是好,继续加油!

View Code
 1 #include<stdio.h>
2 #include<string.h>
3 #include<math.h>
4 #include<algorithm>
5 using namespace std;
6 #define M 16
7 const double eps=1e-8;
8 int map[M][M];
9 const int inf = 1000000;
10 bool flag[M];
11 int D[M],nodes[M],w[M];
12 int n,m,rest[M];
13 double mi_ratio;
14 void prime()
15 {
16 int i,v,k,mi;
17 int ret=0;
18 for(i=1;i<=m;i++){
19 flag[nodes[i]]=0;
20 D[nodes[i]]=inf;
21 }D[nodes[1]]=0;flag[nodes[1]]=1;v=nodes[1];
22 for(k=1;k<m;k++){
23 for(i=1;i<=m;i++)if(!flag[nodes[i]]){
24 if(map[v][nodes[i]]<D[nodes[i]])
25 D[nodes[i]]=map[v][nodes[i]];
26 }
27 mi=inf;
28 for(i=1;i<=m;i++)
29 if(!flag[nodes[i]]&&D[nodes[i]]<mi)
30 mi=D[v=nodes[i]];
31 flag[v]=1;
32 ret+=mi;
33 }//printf(" ret=%d\n",ret);
34 int nodes_w=0;
35 for(i=1;i<=m;i++)
36 nodes_w+=w[nodes[i]];
37 if(ret*1.0/nodes_w<mi_ratio)
38 {
39 mi_ratio=ret*1.0/nodes_w;
40 for(i=1;i<=m;i++)
41 rest[i]=nodes[i];
42 }
43 }
44 void dfs(int dep,int now)
45 {
46 if(dep==m+1){
47 /* for(int i=1;i<=m;i++)
48 printf("hh=%d ",nodes[i]);
49 printf("\n");*/
50 prime(); return ;}
51 for(int i=now;i<=n;i++){
52 nodes[dep]=i;
53 dfs(dep+1,i+1);
54 }
55 }
56 int main()
57 {
58 int i,j,k;
59 while(scanf("%d%d",&n,&m),(n+m)){
60 for(i=1;i<=n;i++)
61 scanf("%d",&w[i]);
62 for(i=1;i<=n;i++)
63 for(j=1;j<=n;j++)
64 scanf("%d",&map[i][j]);
65 mi_ratio=inf;
66 dfs(1,1);
67 printf("%d",rest[1]);
68 for(i=2;i<=m;i++)
69 printf(" %d",rest[i]);
70 printf("\n");
71 }
72 return 0;
73 }



你可能感兴趣的:(最小生成树)