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

2022-05-24 06:42:11 字數 1704 閱讀 3876

咕咕咕

prim的特點是從乙個點開始,不斷把距離最短的點加入圖中,在以此延伸。是一種貪心的想法。當知道prim的特點的時候,就可以想到這題用prim。

這題又要求實際路徑=最短路徑,,也可以想到用dijkstra。

具體做法:

用dijkstra求出1號犯賤到每個房間的單元最短路。把樹形城堡看做以1為根的有根樹。

把所有節點按照dis值排序,從小到大一次考慮吧每個節點p加入樹形城堡有多少種方法。

和prim類似,維護「最短路徑生成樹」的一部分記為t

統計有多少個節點x滿足,x∈t並且dis[ p ] = dis [ x ] + edge ( x , p ),其中edge表示邊的長度。

讓p與其中任意乙個x項鍊都符合題目的要求。

根據乘法原理,把每一步統計出的資料乘起來,即可得答案。

#include#include

#include

#include

#define mk make_pair

#define ll long long

using

namespace

std;

inline

intread()

while(ch >= '

0' && ch <= '9'

)

return sum *p;

}const

int m = 5e5 + 10

;const

int n = 1e3 + 5

;const

int mod = 2147483647

;int

n,m;

inthead[n],cnt;

struct

edge

e[m<<1

];priority_queue

int,int> >q;

bool

vis[n];

intdis[n],sum[n];

struct

potp[n];

void add(int x,int y,int v)//

加邊 void

dijkstra()} }

}bool

cmp(pot a,pot b)

intmain()

dijkstra();

//for(int i = 1;i <= n;i++)

//printf("%d-===-%d\n",i,dis[i]);

//puts("\n");

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

sort(p+1,p+n+1

,cmp);

memset(vis,

false,sizeof

(vis));

vis[

1] = true

;

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

}//for(int i = 1;i <= n;i++)

//printf("%d----%d\n",i,sum[i]);

ll ans = 1

;

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

ans = (ans * sum[i])%mod;

printf(

"%lld

",ans);

return0;

}

黑暗城堡(最小生成樹)

傳送門 解析 這道書上例題主要用dijkstra演算法解決,但是關鍵的一步是如何計算有多少種方案。統計有多少個節點滿足x屬於t,並且dis p dis x edge x,p 其中edge表示邊的長度。根據乘法原理,我們把每一步統計出的數量乘起來,就得到了題目的結果。include define in...

黑暗城堡(最短路徑樹)

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

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

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