黑暗城堡(最短路徑樹)

2022-09-01 13:45:21 字數 1955 閱讀 3580

黑暗城堡

(castle.pas/c/cpp)

題目描述

在順利攻破 lord lsp 的防線之後,lqr 一行人來到了 lord lsp 的城堡下方。lord lsp 黑化

之後雖然擁有了強大的超能力,能夠用意念力製造建築物,但是智商水平卻沒怎麼增加。現

在 lqr 已經搞清楚黑暗城堡有 n 個房間,m 條可以製造的雙向通道,以及每條通道的長度。

lqr 深知 lord lsp 的想法,

為了避免每次都要琢磨兩個

房間之間的最短路徑,lord lsp一定會把城堡修建成樹形的;

但是,為了盡量提高自己的移動效率,lord lsp 一定會使得

城堡滿足下面的條件:設 di

為如果所有的通道都被修建,

第 i 號房間與第 1 號房間的最

短路徑長度;而 si

為實際修建

的樹形城堡中第 i 號房間與第

1 號房間的路徑長度,對於所有滿足 1≤i≤n 的整數 i,有 si = di

要忙著出模擬賽,所以這個任務就交給你了。當然,你只需要輸出答案對 231 – 1 取模之後的結果就行了。

第一行有兩個整數 n 和 m。

之後 m 行,每行三個整數 x,y 和 l,表示可以修建 x 和 y 之間的一條長度為 l 的通道。

輸出乙個整數,表示答案對 231 – 1 取模之後的結果。33

1221

3123

1樣例輸出

2資料範圍與約定

對於 30% 的資料,2≤n≤5,m≤10。

對於 50%  的資料,滿足條件的方案數不超過 10000。

對於 100%  的資料,2≤n≤1000,n – 1≤m≤n(n – 1)/2,1≤l≤100。

題目要求源點到其餘點的最短路徑d[i],並且求樹上路徑s[i]等於d[i]的生成樹

所以先求出最短路徑d[i],並記錄d[i[是哪個點的最短路徑屬性為v;

然後按長度大小進行排序,為了避免重複計數,,最後把滿足d[x]=d[y]+w[i][j]的乙個點乙個點的往生成樹之中加

根據乘法原理求出答案即可

#include#include

#include

#include

using

namespace

std;

typedef

long

long

ll;

const

int maxn=1010

;const ll nil=(long

long)1

<<40-1

;#define mod ((1<<31)-1)

struct

my;

struct

lmjer;

struct

node};

intfa,adj[maxn],n,m;

ll tu[maxn][maxn];

lmjer d[maxn];

bool

done[maxn];

priority_queue

q;my bian[maxn*maxn];

void myinsert(int u,int

v,ll w)

void dijkstra(int

s) }

}} bool cmp(const lmjer a,const

lmjer b)

intmain()

dijkstra(1);

sort(d+1,d+1+n,cmp);

int ans=1

;

for (int i=2;i<=n;i++)

ans=(long

long)ans*temp%mod;

}printf(

"%d\n

",ans);

return0;

}

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

傳送門 通過學習我們可以發現原題目要求的樹結構就是 最短路徑生成樹 什麼是最短路徑生成樹呢?就是一張圖的源點到圖中的所有結點的最短路徑構成的樹,為什麼他滿足樹結構呢?因為假設有n個點,因為是最短路徑一定只有n 1條邊把他連起來。那對於本題,每個點的d i d i d i 可以先跑一遍dij kstr...

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

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

最短路徑樹

問題描述 所謂最短路徑樹,就是從s出發,沿著樹上的邊走到任意點i,那麼經過的這些邊的權值和就是s到i的最短路徑。dijkstra演算法或spfa演算法不僅可計算從起點s到各點的最短路徑長度,同時也可得到以s為根的最短路徑樹。方法是在進行鬆弛操作時,如果d i c d j 時,除了更新d j 之外,還...