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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

POJ3013 Big Christmas Tree(最短路径树)

發(fā)布時(shí)間:2024/1/17 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ3013 Big Christmas Tree(最短路径树) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目大概說給一張點(diǎn)和邊都有權(quán)的圖,現(xiàn)在要求其一棵以1結(jié)點(diǎn)為根的生成樹使樹的邊權(quán)和最小,樹邊權(quán) = 對應(yīng)的圖邊權(quán) * 樹邊末端點(diǎn)為根的子樹所有結(jié)點(diǎn)對于圖頂點(diǎn)的點(diǎn)權(quán)和。

要求∑(邊權(quán)*子樹點(diǎn)權(quán)和),等價(jià)于求∑(點(diǎn)權(quán)*點(diǎn)到根路徑上的邊權(quán)和)。

而如果在圖中各個(gè)點(diǎn)到根都存在最短路,那么最短路的邊一定能構(gòu)造出一棵生成樹。一個(gè)構(gòu)造方法就是在進(jìn)行最短路的松弛操作時(shí)記錄各點(diǎn)是從哪點(diǎn)轉(zhuǎn)移的,而各點(diǎn)的這個(gè)前驅(qū)是唯一的這就對應(yīng)著各點(diǎn)的父結(jié)點(diǎn)。這就是最短路徑樹。

那么這一題直接求各個(gè)點(diǎn)到1點(diǎn)的最短路,最后乘一下加一下就OK了。

1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6 #define INF (1LL<<60) 7 #define MAXN 55555 8 #define MAXM 55555*2 9 10 struct Edge{ 11 int v,w,next; 12 }edge[MAXM]; 13 int NE,head[MAXN]; 14 void addEdge(int u,int v,int w){ 15 edge[NE].v=v; edge[NE].w=w; edge[NE].next=head[u]; 16 head[u]=NE++; 17 } 18 19 long long d[MAXN]; 20 bool vis[MAXN]; 21 bool SPFA(int n){ 22 for(int i=1; i<=n; ++i){ 23 d[i]=INF; vis[i]=0; 24 } 25 d[1]=0; vis[1]=1; 26 queue<int> que; 27 que.push(1); 28 while(!que.empty()){ 29 int u=que.front(); que.pop(); 30 for(int i=head[u]; i!=-1; i=edge[i].next){ 31 int v=edge[i].v; 32 if(d[v]>d[u]+edge[i].w){ 33 d[v]=d[u]+edge[i].w; 34 if(!vis[v]){ 35 vis[v]=1; 36 que.push(v); 37 } 38 } 39 } 40 vis[u]=0; 41 } 42 for(int i=1; i<=n; ++i){ 43 if(d[i]==INF) return 0; 44 } 45 return 1; 46 } 47 48 int weight[MAXN]; 49 int main(){ 50 int t,n,m,a,b,c; 51 scanf("%d",&t); 52 while(t--){ 53 scanf("%d%d",&n,&m); 54 for(int i=1; i<=n; ++i){ 55 scanf("%d",weight+i); 56 } 57 NE=0; 58 memset(head,-1,sizeof(head)); 59 while(m--){ 60 scanf("%d%d%d",&a,&b,&c); 61 addEdge(a,b,c); 62 addEdge(b,a,c); 63 } 64 if(!SPFA(n)){ 65 puts("No Answer"); 66 continue; 67 } 68 long long ans=0; 69 for(int i=1; i<=n; ++i){ 70 ans+=d[i]*weight[i]; 71 } 72 printf("%lld\n",ans); 73 } 74 return 0; 75 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/WABoss/p/5475577.html

總結(jié)

以上是生活随笔為你收集整理的POJ3013 Big Christmas Tree(最短路径树)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。