黑暗城堡
(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 之外,還...