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