3 2 30 20 10 0 6 2 6 0 3 2 3 0 2 2 1 1 0 2 2 0 0 0
1 3 1 2
#include<iostream> #include<string.h> using namespace std; const int INF=0x1f1f1f1f; int edge[20][20]; int node[20]; bool flag[20]; bool f1[20]; double res; int dfs_cnt; bool arr[20]; int n,m; int mst() { int ret=0; int low[20]={0}; int sta; for(int i=1;i<=n;i++) { if(f1[i]) { sta=i; break; } } low[sta]=0; flag[sta]=1; for(int i=1;i<=n;i++) { if(f1[i]) { low[i]=edge[sta][i]; } } for(int i=1;i<m;i++) { int Min=INF; int loc; for(int j=1;j<=n;j++) { if(f1[j]&&!flag[j]&&low[j]<Min) { Min=low[j]; loc=j; } } flag[loc]=1; ret+=low[loc]; for(int j=1;j<=n;j++) { if(f1[j]&&!flag[j]) { if(edge[loc][j]<low[j]) { low[j]=edge[loc][j]; } } } } return ret; } void dfs(int v) { f1[v]=1; dfs_cnt++; if(dfs_cnt==m) { memset(flag,0,sizeof(flag)); int r=mst(); int sum=0; for(int i=1;i<=n;i++) { if(f1[i]) { sum+=node[i]; } } double ans=double(r)/double(sum); if(ans-res<-(1e-9)) { memcpy(arr,f1,sizeof(f1)); res=ans; } f1[v]=0; dfs_cnt--; return ; } for(int i=v+1;i<=n;i++) { dfs(i); } f1[v]=0; dfs_cnt--; } int main() { while(cin>>n>>m,n+m) { for(int i=1;i<=n;i++) cin>>node[i]; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) cin>>edge[i][j]; } res=double (INF); for(int i=1;i<=n-m+1;i++) { memset(f1,0,sizeof(f1)); dfs_cnt=0; dfs(i); } int fir=1; for(int i=1;i<=n;i++) { if(arr[i]) { if(fir) { fir=0; cout<<i; } else cout<<" "<<i; } } cout<<endl; } return 0; }
HDU ACM 2489 Minimal Ratio Tree
原文地址:http://blog.csdn.net/lsgqjh/article/details/46228691