哈理工OJ 1795 发现王国之旅(最小生成树)
生活随笔
收集整理的這篇文章主要介紹了
哈理工OJ 1795 发现王国之旅(最小生成树)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
發現王國之旅
Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: 20(9 users) Total Accepted: 11(9 users) Rating: Special Judge: No
Description
暑期將至,壯壯和胖胖約定去“發現王國”游樂園游玩。壯壯看到過山車,跳樓機,海盜船等等已經激動得不能自控,胖胖卻已經雙腿發軟了。
游樂園中的每個設施都是由一些道路連接的,并且不存在一個地方有兩個游樂設施。游樂園中還有一個奇怪的規定,就是經過每條道路,都要買一張該道路的通行證,而且有了該通行證之后,該條道路可以隨意經過,并且游樂園里每條道路的通行證票價都是一樣。壯壯想玩遍所有的游樂設施,但是又想花盡可能少的錢買通行證。道路花錢的原因主要是因為道路上有許多有趣的東西可以觀看,壯壯走每條道路都會獲得一個歡樂值 Z ,但是每條道路的歡樂值只能獲得一次,現在壯壯想要使得他獲得的所有道路的歡樂值的乘積最大,請你幫幫他吧。
Input
輸入
有多組輸入數據,對于每組輸入數據:第1行為整數n(2<=n<=100),表示游樂項目的數目。此后的n行,每行n個整數。第x+1行y列的整數表示經過x游樂設施到y游樂設施之間的道路可以獲得的歡樂值z,
z為實數( 0
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std;struct node {int x,y;double val; }c[10005];int pre[105];int fin(int x) {if(x==pre[x]){return x;}else{return pre[x]=fin(pre[x]);} }void join(int x,int y) {int t1=fin(x);int t2=fin(y);if(t1!=t2){pre[t1]=t2;} }bool cmp(node p,node q) {return p.val>q.val; }int main() {int n;while(~scanf("%d",&n)){for(int i=1;i<=n;i++){pre[i]=i;}double vv;int sum=0;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){scanf("%lf",&vv);if(i!=j){c[sum].x=i;c[sum].y=j;c[sum++].val=log(vv);}}}sort(c,c+sum,cmp);int ss=0;double re=0;for(int i=0;i<sum;i++){if(fin(c[i].x)!=fin(c[i].y)){join(c[i].x,c[i].y);re+=c[i].val;}}printf("%.3lf\n",re);}return 0; }總結
以上是生活随笔為你收集整理的哈理工OJ 1795 发现王国之旅(最小生成树)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 菜鸟python爬虫_Python爬虫学
- 下一篇: protobuf 数据解析的2种方法