[SCOI2012]滑雪 (最小生成樹 Kruskal)

題目描述

a180285非常喜歡滑雪。他來到一座雪山,這里分布著M條供滑行的軌道和N個軌道之間的交點(同時也是景點),而且每個景點都有一編號i(1iN)和一高度Hi?。a180285能從景點ii滑到景點j當且僅當存在一條i和j之間的邊,且i的高度不小于j。 與其他滑雪愛好者不同,a180285喜歡用最短的滑行路徑去訪問盡量多的景點。如果僅僅訪問一條路徑上的景點,他會覺得數量太少。于是a180285拿出了他隨身攜帶的時間膠囊。這是一種很神奇的藥物,吃下之后可以立即回到上個經過的景點(不用移動也不被認為是a180285 滑行的距離)。請注意,這種神奇的藥物是可以連續食用的,即能夠回到較長時間之前到過的景點(比如上上個經過的景點和上上上個經過的景點)。 現在,a180285站在11號景點望著山下的目標,心潮澎湃。他十分想知道在不考慮時間膠囊消耗的情況下,以最短滑行距離滑到盡量多的景點的方案(即滿足經過景點數最大的前提下使得滑行總距離最小)。你能幫他求出最短距離和景點數嗎?

輸入格式:

輸入的第一行是兩個整數N,M。

接下來1行有N個整數Hi?,分別表示每個景點的高度。

接下來M行,表示各個景點之間軌道分布的情況。每行3個整數Ui?,Vi?,Ki?。表示編號為Ui?的景點和編號為Vi?的景點之間有一條長度為Ki?的軌道。

輸出格式:

輸出一行,表示a180285最多能到達多少個景點,以及此時最短的滑行距離總和。

題解:

對于高度不同的兩點,他們之間的邊是有向的,對于同于高度的點,有邊就可以互相到達,我們只需要選取最短的一些邊使他們仍聯通即可。

若按照正常思路,以邊權排序,直接跑Kruskal的話,會發現可能出現有下面的點連接上面的點,如:他會直接選取兩條邊權為5的邊

?

?

?我們考慮如何消除高度的影響,我們以終點高度為第一關鍵字,邊權為第二關鍵字排序,那么就不可能出現上面的情況,因為他會先選20的邊。

相當于選點是逐層進行的,上面的點一定會先被選取,所以這個點選了之后,不可能再連一條向上的邊。

接著愉快地打出了代碼。

#include<bits/stdc++.h>
using namespace std;
#define ll long longconst int maxn=1000005;
int n,m;
ll ans;
int fa[maxn],h[maxn];
struct edge{int x,y;ll k;
}a[maxn];template<class T>inline void read(T &x){x=0;char ch=getchar();while(!isdigit(ch)) ch=getchar();while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
}void swap(ll &x,ll &y){ll t=x;x=y;y=t;}bool cmp(edge a,edge b){if(h[a.y]==h[b.y]) return a.k<b.k;return h[a.y]>h[b.y];
}int find(int x){if(fa[x]==x) return x;return fa[x]=find(fa[x]);
}void kruskal(){sort(a+1,a+m+1,cmp);int k=0;for(int i=1;i<=m;i++){int dx=find(a[i].x),dy=find(a[i].y);if(dx!=dy){fa[dx]=dy;ans+=a[i].k;k++;}if(k==n-1) break;;}printf("%d %lld",k+1,ans);
}int main(){read(n);read(m);for(int i=1;i<=n;i++) read(h[i]),fa[i]=i;for(int i=1;i<=m;i++){int x,y,z;read(x);read(y);read(z);if(h[x]<h[y]) swap(x,y);a[i]=(edge){x,y,z};}kruskal();
}
View Code

然后。。。。。

我們會發現是什么沒考慮到呢?接著便可以發現可能有出發點達不到的地方,這些地方是沒用的。

那么就可以考慮記錄1可以利用的邊,用這些邊跑Kruskal。在最初讀入時對于高度不同的點建有向邊

高度相同建雙向邊,跑一邊dfs,要判斷是否遍歷過

#include<bits/stdc++.h>
using namespace std;
#define ll long longconst int maxn=1000005;
int n,m,_n=1,cnt;
ll ans;
int fa[maxn],h[maxn];
bool vis[maxn];
vector<pair<int,ll> >e[maxn];
struct edge{int x,y;ll k;
}a[maxn];template<class T>inline void read(T &x){x=0;char ch=getchar();while(!isdigit(ch)) ch=getchar();while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
}void swap(ll &x,ll &y){ll t=x;x=y;y=t;}bool cmp(edge a,edge b){if(h[a.y]==h[b.y]) return a.k<b.k;return h[a.y]>h[b.y];
}int find(int x){if(fa[x]==x) return x;return fa[x]=find(fa[x]);
}void kruskal(){sort(a+1,a+cnt+1,cmp);int k=0;for(int i=1;i<=cnt;i++){int dx=find(a[i].x),dy=find(a[i].y);if(dx!=dy){fa[dx]=dy;ans+=a[i].k;k++;}if(k==_n-1) break;}printf("%d %lld",_n,ans);
}void dfs(int u,int f){for(unsigned int i=0;i<e[u].size();i++){int v=e[u][i].first;if(v==f) continue;a[++cnt]=(edge){u,v,e[u][i].second};if(!vis[v]){vis[v]=true;_n++;dfs(v,u);}}
}int main(){read(n);read(m);for(int i=1;i<=n;i++) read(h[i]),fa[i]=i;for(int i=1;i<=m;i++){int x,y,z;read(x);read(y);read(z);if(h[x]<h[y]) swap(x,y);e[x].push_back(make_pair(y,z));if(h[x]==h[y]) e[y].push_back(make_pair(x,z));}vis[1]=true;dfs(1,0);kruskal();
}
View Code

?

轉載于:https://www.cnblogs.com/sto324/p/11172209.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248522.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248522.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248522.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

來學習ansibie(1)

# ansible 批量在遠程主機上執行命令 python2.7編寫 ## 安裝 第一步:下載epel源 shellwget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 第二步:安裝 shellyum install -y ansible ## ansible 命令格式 shellUsage: ansible <host-pattern&g…

CQYZOJ P1392 拔河問題

題目\(1\) Description 一個學校舉行拔河比賽&#xff0c;所有的人被分成了兩組&#xff0c;每個人必須&#xff08;且只能夠&#xff09;在其中的一組&#xff0c;且兩個組內的所有人體重加起來盡可能地接近. Input 第\(1\)行是一個\(n\)&#xff0c;表示參加拔河比賽的總人數…

靈活的Vue組件——原來這么簡單

本篇學習目標 能夠理解vue組件概念和作用能夠掌握封裝組件能力能夠使用組件之間通信能夠完成todo案例 1. vue組件 1.0_為什么用組件 以前做過一個折疊面板 需求: 現在想要多個收起展開的部分 方案1: 復制代碼 代碼重復 冗余不利于維護 案例用less寫的樣式, 所以下載 ya…

FOI冬令營 Day 3

目錄 T1、簽到題&#xff08;sort&#xff09;傳送門 Code T2、送分題&#xff08;queue&#xff09;傳送門 Code T3、簡單題&#xff08;game&#xff09;傳送門 Code 咕咕咕T1、簽到題&#xff08;sort&#xff09; 傳送門 原題&#xff1a;LOJ 2767 Code //2019/2/14 //50…

委托事件觀察者模式

委托的默認返回類型&#xff1a;void 聲明委托的關鍵字&#xff1a;delegate 多播委托&#xff1a;將多個方法綁定到一個委托變量 在調用方法時 可以執行綁定的方法 委托的描述&#xff1a; 委托是一個類 定義了方法的類型 可以將方法當做另一個方法進行傳遞 委托并不等同于方法…

贏在CSDN——名利兼收

文章目錄&#x1f30a; 相識CSDN&#x1f30a; 益于CSDN流量將成為你我的亮點我的專欄收益到賬啦學習會員助你拿捏專欄更多曝光自己的機會CSDN問答為你準備的零花錢&#x1f30a; 忠于CSDN&#x1f30a; 相識CSDN 小編自注冊CSDN至今兩年有余&#xff0c;記得初衷也僅僅是為了…

124angular1實現無限表單(僅供自己看)

//將本行的內容對象作為參數&#xff0c;傳給點擊函數&#xff0c;點擊函數向后臺發送請求&#xff0c;把獲取的返回值作為內容對象的一個屬性。 (function (angular) {angular.module(myModule, []).directive(treeModel, [$compile, function ($compile) {return {restrict: …

了解 Vue SSR 這一篇足以

文章目錄1 - 什么是服務器端渲染&#xff1f;1.1 新建server文件夾1.2 生成一個node項目1.3 安裝express1.4 服務端渲染小案例1.5 運行查看效果1.6 打開瀏覽器1.7 右鍵查看源代碼2 - 什么是客戶端渲染&#xff1f;2.1 新建client文件夾2.2 生成一個vue項目2.3 安裝依賴并啟動2.…

3 數組中的重復數字

題目描述 在一個長度為 n 的數組里的所有數字都在 0 到 n-1 的范圍內。數組中某些數字是重復的&#xff0c;但不知道有幾個數字是重復的&#xff0c;也不知道每個數字重復幾次。請找出數組中任意一個重復的數字。 Input: {2, 3, 1, 0, 2, 5}Output: 2 思路 給出了長度為n且數組…

小型軟件項目開發流程探討

一&#xff0e;導言國內很多項目都是小型項目, 參與人員少(兩到五個人), 要快速交付(一兩個月) . 要成功完成這種項目, 除了使用成熟且被團隊成員熟練使用的技術之外, 有一個良好的開發流程, 也是很必要的. 二&#xff0e;小型軟件項目開發流程下圖是我對小型軟件項目開發流程…

Vue2的核心原理剖析

? 用了這么久的Vue2了你真的 知其然&#xff0c;知其所以然么&#xff1f; ?今天博主就為大家帶來一篇對Vue核心功能的部分剖析\textcolor{pink}{今天博主就為大家帶來一篇對Vue核心功能的部分剖析}今天博主就為大家帶來一篇對Vue核心功能的部分剖析 ?后續文章會用更多小案…

Scrum之成敗——從自身案例說起,僅供參考

從07年中初次接觸Scrum的概念到其中幾年項目中逐漸實踐CI、TDD&#xff0c;到親自掌握項目實踐Scrum近一年&#xff0c;最終我們放棄了Scrum這個框架和所謂的“自組織”。原因為何&#xff1f; 1.成員放棄了Scrum所“賦予”的“權利” 比如領用任務、評估工作量、自組織協作、決…

sanic官方文檔解析之下載和Configuration

1,sanic框架是做什么的? sanic的官方網址:https://sanic.readthedocs.io/en/latest/sanic框架是一個類似于flask框架的在Python3.5以上版本的文本服務器,他能夠快速的編寫,它是通過驚人的開發效率完成開發,希望通過這篇文章得到激勵sanic框架的理念是:簡單,高效 sanic的應用如…

首秀 Express 框架

文章目錄框架特性express的使用初始化項目&#xff1a;下載框架模塊&#xff1a;測試代碼&#xff1a;總結以上代碼&#xff1a;請求處理的中間件概念&#xff1a;中間件——app.use基本用法&#xff1a;next的用法app.use中間件的應用路由的保護網站維護公告自定義404&#xf…

云原生技能樹測評

前言 利用午休后的10多分鐘時間&#xff0c;看了看APP的技能樹板塊&#xff0c;簡單的提出幾個看法&#xff01; 答題過程 可以設置為闖關類型&#xff0c;答對一道后可以進入下一關&#xff0c;或者是一個章節為一關&#xff0c;讓大家一直有一種期待 回答錯誤數量 可以…

原型和閉包

原型和閉包 一切皆對象 一切皆對象&#xff08;類型值除外&#xff09; undefined, number, string, boolean屬于簡單的值類型 函數、數組、對象、new Number(10)都是對象。他們都是引用類型 Null是基本數據類型&#xff0c;不是引用數據類型 基本數據類型的值就是它本身的值&a…

python 排序算法

冒泡排序&#xff1a; 1 #coding:utf-82 3 比較相鄰的元素&#xff0c;每一趟交換后&#xff0c;最后的元素是最大的。4 第一次比較n-1次&#xff0c;第二次比較n-2次。。。第n-1次比較1次5 進行n-1次冒泡次數6 最優時間復雜度O(n),最壞時間復雜度O(n^2)7 8 9 def bubble_sort…

獎勵 CSDN 社區的領軍人物

設計動機 領軍人物榜單在這里&#xff1a;https://blog.csdn.net/rank/list/role CSDN 是中國 IT 人士學習、成長、成功的平臺&#xff0c; 這個平臺有很多博主&#xff0c; 博主寫的很多優秀文章獲得了粉絲。 那么&#xff0c; 博主獲得粉絲之后&#xff0c; 博主以粉絲為榮…

一文教會你何為重繪、回流?

文章目錄css圖層圖層創建的條件重繪(Repaint)回流觸發重繪的屬性觸發回流的屬性常見的觸發回流的操作優化方案requestAnimationFrame----請求動畫幀寫在最后學習目標&#xff1a; 了解前端Dom代碼、css樣式、js邏輯代碼到瀏覽器展現過程了解什么是圖層了解重繪與回流了解前端層…

mockjs中的方法(三)

1&#xff09;Mock.mock()&#xff1b; Mock.mock( url, type, template, function(options) ); 其中 url 是定義我們要請求的 url 地址&#xff0c;以便于我們請求的時候 mock 去進行攔截&#xff0c;知道我們要去請求那個值&#xff1b;但是它也是可選的&#xff0c;而且格式…