在北緯 91° ,有乙個神奇的國度,叫做企鵝國。這裡的企鵝也有自己發達的文明,稱為企鵝文明。因為企鵝只有黑白兩種顏色,所以他們的數學也是以二進位制為基礎發展的。
比如早在 1110100111101001 年前,他們就有了異或這樣乙個數學概念。如果你不知道異或是什麼,請出門過牆左轉到這裡。
再比如早在 10000101000010 年前,他們的大科學家 penguin. tu 就提出了圖和最短路徑這樣一些概念。
企鵝國中有 n 座城市,編號從 1 到 n 。
對於任意的兩座城市 i 和 j ,企鵝們可以花費 \((i~\mathrm~j) \times c\) 的時間從城市 i 走到城市 j ,這裡 c 為乙個給定的常數。
當然除此之外還有 \(m\) 條單向的快捷通道,第 \(i\) 條快捷通道從第 \(f_i\) 個城市通向第 \(t_i\) 個城市,走這條通道需要消耗 \(v_i\) 的時間。
現在來自penguinkingdomuniversity 的企鵝豆豆正在考慮從城市 a 前往城市 b 最少需要多少時間?
輸入格式:
從標準輸入讀入資料。
輸入第一行包含三個整數 \(n,m,c\) ,表示企鵝國城市的個數、快捷通道的個數以及題面中提到的給定的常數cc。
接下來的 m 行,每行三個正整數 \(f_i,t_i,v_i (1≤fi≤n,1 \leq t_i \leq n ,1\leq v_i \leq 100)\),分別表示對應通道的起點城市標號、終點城市標號和通過這條通道需要消耗的時間。
最後一行兩個正整數 a,b \((1 \leq c \leq 100)\),表示企鵝豆豆選擇的起點城市標號和終點城市標號。
輸出格式:
輸出到標準輸出。
輸出一行乙個整數,表示從城市 a 前往城市 b 需要的最少時間。
輸入樣例#1:複製
4 2 1
1 3 1
2 4 4
1 4輸出樣例#1:複製
輸入樣例#2:複製
7 2 10
1 3 1
2 4 4
3 6輸出樣例#2:複製
樣例1解釋
直接從 1 走到 4 就好了。
樣例2解釋
先從 3 走到 2 ,再從 2 通過通道到達 4 ,再從 4 走到 6。
一道思路非常巧妙的題目。
在這裡我們要充分利用到異或的性質。
我們知道如果 a^ b ^ c ^ d =a^e時。
就直接建邊a->e了。
也就是說,有些邊是多餘的。
那麼我們怎麼確保必要的邊呢?
乙個點到只需要連線n的每乙個二進位制的1就可以了。
因為所有的異或情況都可以由二進位制組合出來。
那麼邊就是\(m+log(n)\)的。
#include#include#include#include#include#includeusing namespace std;
const int n=4000001;
struct nodee[n];
int num,head[n];
int n,m,c,s,t,dis[n],vis[n];
int read()
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*w;
}void add(int from,int to,int v)
void dijkstra()}}
}int main()
for(int i=0;i<=n;i++)
}s=read();t=read();
dijkstra();
printf("%d\n",dis[t]);
return 0;
}
最短路 最短路徑問題
題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...
最短路徑演算法 最短路
在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...
最短路(最短路之積)
首先考慮暴力維護,顯然極端資料就會炸裂,那麼用什麼來維護呢?考慮乙個很 nb的公式log n m log n log m ok,這道題到此結束 我們只要把乘積轉化為對數,最後再還原就可以了,也不用考慮精度問題,本蒟蒻試著用pow,然後它死了。includeusing namespace std co...