1. 程式人生 > >CCF-CSP-2017-3-4 地鐵修建(結構體優先佇列)

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天。
輸出格式  輸出一個整數,修建整條地鐵線路最少需要的天數。樣例輸入6 6
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 java100分

使用正則表示式解題,塊標籤用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