CCF-CSP-2017-3-4 地鐵修建(結構體優先佇列)
題目:
問題描述 A市有n個交通樞紐,其中1號和n號非常重要,為了加強運輸能力,A市決定在1號到n號樞紐間修建一條地鐵。地鐵由很多段隧道組成,每段隧道連線兩個交通樞紐。經過勘探,有m段隧道作為候選,兩個交通樞紐之間最多隻有一條候選的隧道,沒有隧道兩端連線著同一個交通樞紐。
現在有n家隧道施工的公司,每段候選的隧道只能由一個公司施工,每家公司施工需要的天數一致。而每家公司最多隻能修建一條候選隧道。所有公司同時開始施工。
作為專案負責人,你獲得了候選隧道的資訊,現在你可以按自己的想法選擇一部分隧道進行施工,請問修建整條地鐵最少需要多少天。輸入格式 輸入的第一行包含兩個整數n, m,用一個空格分隔,分別表示交通樞紐的數量和候選隧道的數量。
第2行到第m+1行,每行包含三個整數a, b, c,表示樞紐a和樞紐b之間可以修建一條隧道,需要的時間為c天。
1 2 4
2 3 4
3 6 7
1 4 2
4 5 5
5 6 6樣例輸出6樣例說明 可以修建的線路有兩種。
第一種經過的樞紐依次為1, 2, 3, 6,所需要的時間分別是4, 4, 7,則整條地鐵線需要7天修完;
第二種經過的樞紐依次為1, 4, 5, 6,所需要的時間分別是2, 5, 6,則整條地鐵線需要6天修完。
第二種方案所用的天數更少。評測用例規模與約定 對於20%的評測用例,1 ≤ n ≤ 10,1 ≤ m ≤ 20;
對於40%的評測用例,1 ≤ n ≤ 100,1 ≤ m ≤ 1000;
對於60%的評測用例,1 ≤ n ≤ 1000,1 ≤ m ≤ 10000,1 ≤ c ≤ 1000;
對於80%的評測用例,1 ≤ n ≤ 10000,1 ≤ m ≤ 100000;
對於100%的評測用例,1 ≤ n ≤ 100000,1 ≤ m ≤ 200000,1 ≤ a, b ≤ n,1 ≤ c ≤ 1000000。
所有評測用例保證在所有候選隧道都修通時1號樞紐可以通過隧道到達其他所有樞紐。
程式碼:
#include <iostream>
#include<queue>
#include<vector>
using namespace std;
int n, m;
bool visit[100001];
structdist
{
int id;
int len;
};
distd, d2;
queue<dist>q[100001];
distans[100001];
structcmp
{
bool operator()(dista, distb)
{
return a.len > b.len;
}
};
priority_queue< dist, vector<dist>, cmp>que;
int main()
{
int a, b, c;
cin >> n >> m;
for (int i = 1; i <= n; i++)while (!q[i].empty())q[i].pop();
for (int i = 1; i <= n; i++)
{
ans[i].id = i;
ans[i].len = 1000000;
}
ans[1].len = 0;
while (!que.empty())que.pop();
for (int i = 1; i <= n; i++)que.push(ans[i]);
for (int i = 1; i <= n; i++)visit[i] = false;
while (m--)
{
scanf("%d%d%d", &a, &b, &c);
d.id = b, d.len = c;
q[a].push(d);
d.id = a;
q[b].push(d);
}
while (!que.empty())
{
d = que.top();
que.pop();
if (d.len > ans[d.id].len)continue;
if (visit[d.id])continue;
visit[d.id] = true;
while (!q[d.id].empty())
{
d2 = q[d.id].front();
q[d.id].pop();
if (visit[d2.id])continue;
if (d2.len < ans[d.id].len)d2.len = ans[d.id].len;
if (ans[d2.id].len>d2.len)ans[d2.id].len = d2.len;
que.push(d2);
}
}
cout << ans[n].len;
return 0;
}
使用結構體優先佇列的時候需要注意,修改結構體的成員變數優先佇列並不會自動維護最大(小)堆,為了解決這個問題,我使用的方法是將修改後的結構體變數又插入優先佇列,而在優先佇列彈出一個元素時,直接把它和ans進行對比即可知道它是不是被修改的最後一個版本,如果不是最後一個版本的話,彈出它就行了,不進行任何操作,也不標記visit所以,整個程式的複雜度是O(n+m),n是頂點數,m是邊數
相關推薦
CCF-CSP-2017-3-4 地鐵修建(結構體優先佇列)
題目:問題描述 A市有n個交通樞紐,其中1號和n號非常重要,為了加強運輸能力,A市決定在1號到n號樞紐間修建一條地鐵。 地鐵由很多段隧道組成,每段隧道連線兩個交通樞紐。經過勘探,有m段隧道作為候選,
201803-4 棋局評估(動態規劃+優先佇列)
試題編號: 201803-4 試題名稱: 棋局評估 時間限制: 1.0s 記憶體限制: 256.0MB 問題描述: 問題描述 Alice和Bob正在玩井字棋遊戲。 井字棋遊戲的規則很簡單:兩人輪流往3
201703-4 ccf 地鐵修建 (dijstra的靈活運用)
題目連結: 地鐵修建 題目大意: 中文題,不解釋啊啊!!! 解題思路: 題目要求使得完工時間最短,因為可以同時開工,所以抽象出來就是。從1到n的多條路線中,選一條路徑所經過的邊中最大的邊權最小(看樣例就可以理解這句話了)。 於是我們可以利用求最短路的法子來求這個最大邊權最
CCF習題 201703-4 地鐵修建(dijkstra 或者 最小生成樹)
題意: 很水很水的一道題目, 但自己也很水, 沒得全分= = ~~~ 求使得1和n 連通得一條路中最大路權最小值。 思路: 多個思路: 1. 修改dijkstra,把判斷距離改成判斷 最大路權即可。 2. 最小生成樹,直接按照最小生成樹做,當1和n 連通時就找到答案了,因為
CCF-CSP-2017-3-1 分蛋糕
題目: 問題描述 小明今天生日,他有n塊蛋糕要分給朋友們吃,這n塊蛋糕(編號為1到n)的重量分別為a1, a2, …, an。小明想分給每個朋友至少重量為k的蛋糕。小明的朋友們已經排好隊準備
Python 列表元素分組,比如 [1,2,3,...100]變成 [[1,2,3],[4,5,6]....](列表生成式解決)
range 列表生成式 元素 python 列表 for .... ... 分組 [88 In [29]: a=[x for x in range(1,101)] In [30]: b=[a[x:x+3] for x in range(0,100,3)] In [31]:
降低 80% 的讀寫響應延遲!我們測評了 etcd 3.4 新特性(內含讀寫發展史)
作者 | 陳潔(墨封) 阿里雲開發工程師 導讀:etcd 作為 K8s 叢集中的儲存元件,讀寫效能方面會受到很多壓力,而 etcd 3.4 中的新特性將有效緩解壓力,本文將從 etcd 資料讀寫機制的發展歷史著手,深入解讀 
hdu1873 看病要排隊(結構體優先隊列)
正整數 sel print 優先權 數值 事件 sim node sca 看病要排隊 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total
jchdl - RTL例項 - And2(結構體的使用)
https://mp.weixin.qq.com/s/qTgeBF9N0mx5UK3xWDb3jg jchdl對Verilog做了增強,增加了使用者自定義結構體型別。使用自定義結構體,可以對輸入和輸出介面進行分類,並簡化模組輸入輸出介面的定義。 參考連
PAT甲級1012 (結構體,排序)
題目 To evaluate the performance of our first year CS majored students, we consider their grades of three courses only: C – C Program
二叉樹(堆和優先佇列)
堆是一種特殊的二叉樹。 最小值堆:最小值堆的特性。 對於堆的任意非葉節點K,K的值總是小於或者等於左右子節點。 K <= 左節點;K <= 又節點; 堆例項: 堆實際上是一個完全二叉樹(若設二叉樹的深度為h,除第 h 層外,其它各層 (1~h-1)
Codeforces Round #390 (Div. 2)(A,B,C(記憶化搜尋),D(貪心,優先佇列))
/* Codeforces Round #390 (Div. 2) 時間: 2017/02/16 A. Lesha and array splitting 題意:將集合分成幾個小集合,要求小集合的和不為0. 題解:遍歷過去,一直到不滿足集合並數字非0前生成一個集合 */ #
Expedition POJ 2431 (貪心與優先佇列)
題面: A group of cows grabbed a truck and ventured on an expedition deep into the jungle. Being rather poor drivers, the cows unfortunately managed to
Touch The Sky (氣球抉擇 優先佇列)
題意: 你的飛艇有n個一次性氣球,開始你在海拔0m位置,每一個氣球有一個L和D,你在小於等於L的位置才可以使用這個氣球,使你的海拔上升D。問我最多可以使用幾個氣球 解析: 設A=L+D,對於兩個氣球x和y,他們的A為Ax和Ay。顯然當Ax<Ay時,我會優
UVa 11134 Fabled Rooks(貪心+優先佇列)
題目連結 題目大意: 在一個棋盤上,放置N個國際象棋的城堡,每個城堡給出可以放置的範圍,要求這些城堡不能相互攻擊到,求這些城堡的擺放方案。 解題思路: 這題非常關鍵的一點就是橫縱座標可以分開獨立考慮。對於每一個方向,我們維護一個下限小(其次上線小)的區間
1015. 德才論 (25) (結構體啊 ZJU_PAT)
宋代史學家司馬光在《資治通鑑》中有一段著名的“德才論”:“是故才德全盡謂之聖人,才德兼亡謂之愚人,德勝才謂之君子,才勝德謂之小人。凡取人之術,苟不得聖人,君子而與之,與其得小人,不若得愚人。” 現給出一批考生的德才分數,請根據司馬光的理論給出錄取排名。 輸入格式
【CCF 201703-4】地鐵修建(Kruskal 貪心 並查集)
題目抽象 修建一條結點1到結點n的一條路,使得這條路上最大的邊權最小 思路 從Kruskal演算法得到啟示,將邊按權重排序,不斷地加入最短的邊,直到結點1到結點n連通即可 判斷是否連通的方
(CCF CSP 2017年9月3日) JSON查詢+詳細分析
JSON (JavaScript Object Notation) 是一種輕量級的資料交換格式,可以用來描述半結構化的資料。JSON 格式中的基本單元是值 (value),出於簡化的目的本題只涉及 2 種類型的值: * 字串 (string):字串是由雙引號 " 括起
CCF 2017-3 03-Markdown java(100分)
使用正則表示式解題,塊標籤用string.matches直接匹配,行內標籤使用Pattern達到多次出現,多次替換的效果。 程式碼得分滿分,耗時156ms import java.util.ArrayList; import java.util.List; import java.util.
【C++】CCF 201703-4 地鐵修建 【從80分到100分的優化過程】
#include <bits/stdc++.h> using namespace std; const int MAX_EDGE = 200005; const int MAX_VERTICES = 100005; struct Edge{ int v, len, last; } ed