題意大致如下:給你一張無向帶權圖,有標號為1到n的節點,現在要你選擇一些邊留下來,使得在留下來的邊構成的新的圖里,每個節點到節點1的最小距離不變(即和初始圖一樣),在滿足上述要求的前提下,要使留下來的邊的權重和最小,並求出這個最小權重和。
題解:只要我們用dijsktra演算法加以改造遍歷一遍原圖,就能解決這個問題。而本題與一般的dijsktra模板題不同的地方在於,一般dijsktra只是求出源點到其他個點的最短距離,但並不考慮和記錄路徑,但本題要求的是權重和的最小值,也就是說我們要知道的是最後我們選擇了哪些邊留下來,或者說我們要知道留下來的所有邊的權重是多少。為此,我建立了乙個結構體叫node,它有成員dist和cost,dist是表示它到源點的最小距離,而cost是表示為了使它和源點聯通的最小花費(這個聯通要保證是最短距離的前提下)。至於更新,dist更新和正常dijsktra更新時一樣,先找到乙個目前沒有被加入集合的dist最小的節點u,然後用u來更新周邊節點的dist,cost更新則是隨著dist的更新進行的(如此保證這個cost滿足最小距離這個前提),並且這個cost應該就等於節點u和被更新節點v的邊的權重,即有node[v].cost=weight[u][v]。最後,要注意的就是,有些節點的最短路徑可能不止一條,而且,這些節點被開始的u節點更新得到的cost會要比後面的u節點更新得到的cost要大,所以當有node[v].dist==node[u].dist+weight[u][v]時,要注意更新node[v].cost。(根據題目範圍,dijkstra演算法應用優先佇列進行優化)
輸入: 兩個整數n,m。n是節點數,m是邊數。就下來m行,每行三個數u,v,w,代表節點u,v之間有一條權重為w的邊。
輸出:乙個整數,最小權重和。
**如下:
#include#include#include#include#include#includeusing namespace std;
const int maxn=10100;
const int maxm=101010;
const int inf=0x08080808;
int n,m;
int head[maxn],icount,vis[maxn];
struct edgeedge[maxm*2];
struct nodenode[maxn];
struct dist
};priority_queuepq;
void insert_edge(int u,int v,int w)
void dij(int s)
dist temp=;
node[s].dist=node[s].cost=0;
pq.push(temp);
for(int i=1;i
ccf 交通規劃
問題描述 g國國王來中國參觀後,被中國的高速鐵路深深的震撼,決定為自己的國家也建設乙個高速鐵路系統。建設高速鐵路投入非常大,為了節約建設成本,g國國王決定不新建鐵路,而是將已有的鐵路改造成高速鐵路。現在,請你為g國國王提供乙個方案,將現有的一部分鐵路改造成高速鐵路,使得任何兩個城市間都可以通過高速鐵...
CCF之交通規劃
問題描述 試題編號 201609 4 試題名稱 交通規劃 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 g國國王來中國參觀後,被中國的高速鐵路深深的震撼,決定為自己的國家也建設乙個高速鐵路系統。建設高速鐵路投入非常大,為了節約建設成本,g國國王決定不新建鐵路,而是將已有的鐵路改...
ccf交通規劃(秒)
試題編號 201609 4 試題名稱 交通規劃 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 g國國王來中國參觀後,被中國的高速鐵路深深的震撼,決定為自己的國家也建設乙個高速鐵路系統。建設高速鐵路投入非常大,為了節約建設成本,g國國王決定不新建鐵路,而是將已有的鐵路改造成高速鐵...