CH6202 黑暗城堡(最短路徑生成樹)

2021-08-29 17:55:07 字數 1672 閱讀 6912

傳送門

通過學習我們可以發現原題目要求的樹結構就是「最短路徑生成樹」,什麼是最短路徑生成樹呢?就是一張圖的源點到圖中的所有結點的最短路徑構成的樹,為什麼他滿足樹結構呢?因為假設有n個點,因為是最短路徑一定只有n-1條邊把他連起來。

那對於本題,每個點的d[i

]d[i]

d[i]

可以先跑一遍dij

kstr

adijkstra

dijkst

ra得出來,接下來思考如何計數。

計數方法明顯是要使用乘法原理計數,也就是說我們可以得出每一步的方案數再乘進答案中。

接下來考慮如何的出每一步的方案數,所謂方案數也就是對於每乙個d[i

]d[i]

d[i]

可以從多少個d[j

]d[j]

d[j]

轉移過來,那麼顯然,比較大的距離只能從比較小的距離轉移過來。

所以我們可以先給d

dd陣列遞增排序。 這樣比i

ii小的都是有可能轉移到i

ii的點,那麼我們只需要判斷一下他們之間有沒有邊可以轉移到即可。

#include

#include

#include

#include

#include

#include

#include

#define mkp(a,b) make_pair(a,b)

using namespace std;

typedef

long

long ll;

typedef pair<

int,

int>pii;

const

int n=

1e3+10;

const

int m=

5e5+10;

const ll mod=

(1ll

<<31)

-1;ll mp[n]

[n];

int n,m;

struct edgea[m*2]

;int len,last[n]

;void

ins(

int x,

int y,

int c)

priority_queue

,greater

> q;

int d[n]

; bool v[n]

;void

dijkstra()

}}}struct node

b[n]

;bool cmp

(node a,node b)

intmain()

dijkstra()

;for

(int i=

1;i<=n;i++

) b[i]

.id=i,b[i]

.d=d[i]

;sort

(b+1

,b+n+

1,cmp)

; ll ans=1;

for(

int i=

2;i<=n;i++

) ans=ans*cnt%mod;

}printf

("%lld\n"

,ans)

;return0;

}

CH6202 黑暗城堡

初見安 這裡是乙個我沒用過的 的和bzoj的入門oj的傳送門 ch6202 入門oj p4928 第一行有兩個整數 n 和 m。之後 m 行,每行三個整數 x,y 和 l,表示可以修建 x 和 y 之間的一條長度為 l 的通道。2 n 1000,n 1 m n n 1 2,1 l 100 輸出乙個整...

黑暗城堡(最短路徑樹)

黑暗城堡 castle.pas c cpp 題目描述 在順利攻破 lord lsp 的防線之後,lqr 一行人來到了 lord lsp 的城堡下方。lord lsp 黑化 之後雖然擁有了強大的超能力,能夠用意念力製造建築物,但是智商水平卻沒怎麼增加。現 在 lqr 已經搞清楚黑暗城堡有 n 個房間,...

黑暗城堡 (最小生成樹 最短路)

咕咕咕 prim的特點是從乙個點開始,不斷把距離最短的點加入圖中,在以此延伸。是一種貪心的想法。當知道prim的特點的時候,就可以想到這題用prim。這題又要求實際路徑 最短路徑,也可以想到用dijkstra。具體做法 用dijkstra求出1號犯賤到每個房間的單元最短路。把樹形城堡看做以1為根的有...