HDU 2489 minimal ratio tree (Data Structure-minimal spanning tree)

Source: Internet
Author: User

Minimal ratio tree
Problem descriptionfor a tree, which nodes and edges are all weighted, the ratio of it is calculated according to the following equation.




Given a complete graph of N nodes with all nodes and edges weighted, your task is to find a tree, which is a sub-graph of the original graph, with M nodes and whose ratio is the smallest among all the trees of M nodes in the graph.
 
Inputinput contains multiple test cases. the first line of each test case contains two integers n (2 <= n <= 15) and M (2 <= m <= N ), which stands for the number of nodes in the graph and the number of nodes in the minimal ratio tree. two zeros end the input. the next line contains N numbers which stand for the weight of each node. the following n lines contain a diagonally discounted rical n × n connectivity matrix with each element shows the weight of the edge connecting one node with another. of course, the diagonal will be all 0, since there is no edge connecting a node with itself.



All the weights of both nodes and edges (blocks t for the ones on the diagonal of the matrix) are integers and in the range of [1,100].

The figure below tables strates the first test case in sample input. Node 1 and node 3 form the minimal ratio tree.

 
Outputfor each test case output one line contains a sequence of the M nodes which constructs the minimal ratio tree. nodes shoshould be arranged in ascending order. if there are several such sequences, pick the one which has the smallest node number; if there's a tie, look at the second smallest node number, etc. please note that the nodes are numbered from 1.
Sample Input
3 230 20 100 6 26 0 32 3 02 21 10 22 00 0
 
Sample output
1 31 2
 
Source2008 Asia Regional Beijing
Recommendgaojie | we have carefully selected several similar problems for you: 2491 2485 2490 2492
Question:

Give you a picture of N points, each point has the right value, ask you to select M points, so that the minimum, the output scheme.


Solution:

The scheme of selecting M vertices by enumeration with and without. Since m vertices are selected, the denominator is determined, and the numerator calculates the minimum through the minimal spanning tree.


Solution code:

#include <iostream>#include <cstdio>#include <vector>#include <algorithm>using namespace std;typedef long long ll;const int maxn=20;int n,m,d[maxn],a[maxn][maxn],cnt,father[maxn];struct edge{    int u,v,w;    edge(int u0=0,int v0=0,int w0=0){        u=u0,v=v0,w=w0;    }    friend bool operator <(edge x,edge y){        return x.w<y.w;    }}e[maxn*maxn];int find(int x){    if(father[x]!=x){        father[x]=find(father[x]);    }    return father[x];}int getAns(vector <int> v){    for(int i=0;i<=n;i++) father[i]=i;    cnt=0;    for(int i=0;i<v.size();i++){        for(int j=0;j<v.size();j++){            if(a[v[i]][v[j]]) e[cnt++]=edge(v[i],v[j],a[v[i]][v[j]]);        }    }    sort(e,e+cnt);    int tmp=0;    for(int i=0;i<cnt;i++){        if(find(e[i].u)!=find(e[i].v)){            father[find(e[i].v)]=find(e[i].u);            tmp+=e[i].w;        }    }    return tmp;}void solve(){    int ansm=1,ansz=(1<<30);    vector <int> ansv;    for(int i=0;i<(1<<n);i++){        vector <int> v;        int tmpm=0;        for(int t=0;t<n;t++){            if(i&(1<<t)){                v.push_back(t);                tmpm+=d[t];            }        }        if(v.size()==m){            int tmpz=getAns(v);            if((ll)tmpz*(ll)ansm<(ll)ansz*(ll)tmpm){                ansz=tmpz;                ansm=tmpm;                ansv=v;            }        }    }    for(int i=0;i<ansv.size();i++){        if(i>0) printf(" ");        printf("%d",ansv[i]+1);    }    printf("\n");}int main(){    while(scanf("%d%d",&n,&m)!=EOF && (m||n)){        for(int i=0;i<n;i++) scanf("%d",&d[i]);        for(int i=0;i<n;i++){            for(int j=0;j<n;j++){                scanf("%d",&a[i][j]);            }        }        solve();    }    return 0;}





Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.