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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[Code Plus#4] 最短路

發(fā)布時(shí)間:2024/4/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Code Plus#4] 最短路 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目背景

在北緯 91° ,有一個(gè)神奇的國度,叫做企鵝國。這里的企鵝也有自己發(fā)達(dá)的文明,稱為企鵝文明。因?yàn)槠簌Z只有黑白兩種顏色,所以他們的數(shù)學(xué)也是以二進(jìn)制為基礎(chǔ)發(fā)展的。

比如早在?1110100111101001?年前,他們就有了異或這樣一個(gè)數(shù)學(xué)概念。如果你不知道異或是什么,請出門過墻左轉(zhuǎn)到這里。

再比如早在?10000101000010?年前,他們的大科學(xué)家 Penguin. Tu 就提出了圖和最短路徑這樣一些概念。

題目描述

企鵝國中有?NN?座城市,編號(hào)從?11?到?NN?。

對于任意的兩座城市?ii?和?jj?,企鵝們可以花費(fèi)?(i~\mathrm{xor}~j) \times C(i?xor?j)×C?的時(shí)間從城市?ii?走到城市?jj?,這里?CC?為一個(gè)給定的常數(shù)。

當(dāng)然除此之外還有?MM?條單向的快捷通道,第?ii?條快捷通道從第?F_iFi???? 個(gè)城市通向第?T_iTi???? 個(gè)城市,走這條通道需要消耗?V_iVi???? 的時(shí)間。

現(xiàn)在來自?Penguin?Kingdom?University 的企鵝豆豆正在考慮從城市?AA?前往城市?BB?最少需要多少時(shí)間?

輸入輸出格式

輸入格式:

?

從標(biāo)準(zhǔn)輸入讀入數(shù)據(jù)。

輸入第一行包含三個(gè)整數(shù)?N,M,CN,M,C?,表示企鵝國城市的個(gè)數(shù)、快捷通道的個(gè)數(shù)以及題面中提到的給定的常數(shù)CC?。

接下來的?MM?行,每行三個(gè)正整數(shù)?F_i,T_i,V_iFi?,Ti?,Vi??? (1 \leq F_i \leq N1Fi?N?,1 \leq T_i \leq N ,1\leq V_i \leq 1001Ti?N,1Vi?100?),分別表示對應(yīng)通道的起點(diǎn)城市標(biāo)號(hào)、終點(diǎn)城市標(biāo)號(hào)和通過這條通道需要消耗的時(shí)間。

最后一行兩個(gè)正整數(shù)?A,BA,B?(1 \leq C \leq 100)(1C100)?,表示企鵝豆豆選擇的起點(diǎn)城市標(biāo)號(hào)和終點(diǎn)城市標(biāo)號(hào)。

?

輸出格式:

?

輸出到標(biāo)準(zhǔn)輸出。

輸出一行一個(gè)整數(shù),表示從城市?AA?前往城市?BB?需要的最少時(shí)間。

?

輸入輸出樣例

輸入樣例#1:?
4 2 1 1 3 1 2 4 4 1 4 輸出樣例#1:?
5 輸入樣例#2:?
7 2 10 1 3 1 2 4 4 3 6 輸出樣例#2:?
34

說明

樣例1解釋

直接從?11?走到?44?就好了。

樣例2解釋

先從?33?走到?22?,再從?22?通過通道到達(dá)?44?,再從?44?走到?66?。

?

活潑可愛的出題人給大家留下了下面這張圖。

Credit:?https://www.luogu.org/discuss/show/38908

?

?

? ? 如果暴力把圖建出來的話,邊的級(jí)別是O(N^2)的,肯定不行。。。暴力的局限在于沒有用到異或的特殊性

? ? 如果我們從一個(gè)點(diǎn)i,每次直走到變某一位的點(diǎn),最后走到j(luò),那么滿足至少存在一條 邊權(quán)和= i xor j的路徑,這個(gè)是比較顯然的。

? ? 所以我們把這個(gè)圖建出來然后再直接跑最短路就好啦。

但是要注意,要把n補(bǔ)到 2^i-1,因?yàn)橛幸恍┲虚g點(diǎn)會(huì)>n。

#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=200005; int ci[33],n,m,d[maxn],val[maxn*37],C,S,T; int hd[maxn],to[maxn*37],ne[maxn*37],num; bool v[maxn]; struct node{int x,dis;bool operator <(const node &u)const{return dis>u.dis;} }; priority_queue<node> q;inline void add(int u,int v,int w){to[++num]=v,ne[num]=hd[u],hd[u]=num,val[num]=w; }inline void dij(){memset(d,0x3f,sizeof(d));d[S]=0,q.push((node){S,0});node x;while(!q.empty()){x=q.top(),q.pop();if(v[x.x]) continue;v[x.x]=1;for(int i=hd[x.x];i;i=ne[i]) if(d[x.x]+val[i]<d[to[i]]){d[to[i]]=d[x.x]+val[i];q.push((node){to[i],d[to[i]]});}}printf("%d\n",d[T]); }int main(){ci[0]=1;for(int i=1;i<=20;i++) ci[i]=ci[i-1]<<1;scanf("%d%d%d",&n,&m,&C);int uu,vv,ww;for(int i=1;i<=m;i++){scanf("%d%d%d",&uu,&vv,&ww);add(uu,vv,ww);}scanf("%d%d",&S,&T);int U=n;for(n=1;n<=U;n<<=1);n--;for(int L=0;ci[L]<=n;L++)for(int i=1,TO;i<=n;i++){TO=i^ci[L];if(TO) add(i,TO,ci[L]*C);}dij();return 0; }

  

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

總結(jié)

以上是生活随笔為你收集整理的[Code Plus#4] 最短路的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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