日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

黑暗城堡-(最小生成树+最短路)

發布時間:2025/7/14 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 黑暗城堡-(最小生成树+最短路) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

咕咕咕

?

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<cstdio> #include<algorithm> #include<queue> #include<cstring> #define mk make_pair #define ll long long using namespace std; inline int read() {int sum = 0,p = 1;char ch = getchar();while(ch < '0' || ch > '9'){if(ch == '-')p = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){(sum *= 10) += ch - '0';ch = getchar();} return sum * p; }const int M = 5e5 + 10; const int N = 1e3 + 5; const int mod = 2147483647; int n,m; int head[N],cnt; struct edge {int nxt,to,wei; }e[M<<1]; priority_queue<pair<int,int> > q; bool vis[N]; int dis[N],sum[N]; struct pot {int id,dis; }p[N];void add(int x,int y,int v)//加邊 {e[++cnt].nxt = head[x];e[cnt].to = y;e[cnt].wei = v;head[x] = cnt; }void dijkstra() {memset(dis,0x3f,sizeof(dis));dis[1] = 0;q.push(mk(0,1));while(q.size()){int u = q.top().second;q.pop();if(vis[u])continue;vis[u] =true;for(int i = head[u];i;i = e[i].nxt){int v = e[i].to;if(dis[u] + e[i].wei < dis[v]){dis[v] = dis[u] +e[i].wei;q.push(mk(-dis[v],v));}} } }bool cmp(pot a,pot b) {return a.dis < b.dis; }int main() {n = read(),m = read();for(int i = 1;i <= m;i++){int x = read(),y = read(),l = read();add(x,y,l);add(y,x,l); } dijkstra();// for(int i = 1;i <= n;i++) // printf("%d-===-%d\n",i,dis[i]); // puts("\n");for(int i = 1;i <= n;i++){p[i].id = i;p[i].dis = dis[i];}sort(p+1,p+n+1,cmp);memset(vis,false,sizeof(vis));vis[1] = true;for(int i = 2;i <= n;i++){vis[p[i].id] = true;for(int j = head[p[i].id];j;j = e[j].nxt){int v = e[j].to;if(vis[v] && dis[v] + e[j].wei == p[i].dis)sum[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);return 0; }

?

轉載于:https://www.cnblogs.com/darlingroot/p/11278752.html

總結

以上是生活随笔為你收集整理的黑暗城堡-(最小生成树+最短路)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。