XSY1162 鬼計之夜 最短路

2021-08-09 04:32:57 字數 1464 閱讀 9665

給你乙個

n 個點

m條邊的有向圖,有

k 個關鍵點。求一條最短的從乙個關鍵點到另乙個關鍵點的路徑。n,

m,k≤

100000跑k

2 次最短路顯然會tle

考慮兩個不同的數有什麼可以利用的性質。

其中會有至少乙個二進位制為不同!

所以可以列舉所有二進位制位,從

0 的那邊向

1的那邊跑最短路,再從

1 的那邊向

0的那邊跑最短路。

這樣最終答案一定會被計算到。

時間複雜度:o(

mlog

nlog

k)

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

typedef

unsigned

long

long ull;

typedef pair pii;

typedef pairint> pli;

struct graph

void add(int x,int y,int z)

};graph g;

//int lx[100010];

//int ly[100010];

//int lz[100010];

ll d[100010];

int b[100010];

int c[100010];

int n,m,k;

priority_queuevector

,greater> q;

ll dij(int y)

ll ans=0x7fffffffffffffffll;

for(i=1;i<=k;i++)

if(b[c[i]]&&!((i>>(y-1))&1))

ans=min(ans,d[c[i]]);

return ans;

}ll dij2(int y)

ll ans=0x7fffffffffffffffll;

for(i=1;i<=k;i++)

if(b[c[i]]&&(i>>(y-1))&1)

ans=min(ans,d[c[i]]);

return ans;

}int main()

for(i=1;i<=k;i++)

scanf("%d",&c[i]);

ll ans=0x7fffffffffffffffll;

for(i=1;i<=17;i++)

printf("%lld\n",ans);

return

0;}

xsy2304 哈 最短路

題目大意 有乙個 n 個點,m 條有向邊的圖,有 q 組詢問。每次詢問 從 a 到 b 經過不超過 c 條邊,且依次經過的邊邊權遞增,問最短路為多少,無解輸出 1。資料範圍 n 150 m 5000 q 1000 我場上並沒有去想正解,打了個spfa居然獲得 90pts 好成績。首先對於經過不超過 ...

XSY2679 修牆 最短路

有乙個 n 1 m 1 的網格,每條邊都有乙個邊權。有一些格仔是城市。你要用乙個環圈住所有城市,要求環上所有邊的邊權和最小。重合的邊邊權算多次。保證左上角 1 1 一定有乙個城市。n,m 400 觀察到左上角一定有乙個城市。首先求出每個城市左上角到 0 0 的最短路,那麼這個圈肯定不會經過最短路。如...

XSY3370 道路建設 最短路

有乙個完全圖,邊有邊權。對於每個 i 求一棵生成樹,使得 sum n j 到 i 的路徑上邊權最小值 最小。n leq 2000,w leq 9 記最小的邊權 w 這條邊的乙個端點為 s 那麼 i 號點對應的生成樹就是從 i 到 s 的一條路徑,然後經過邊權最小的邊,再連向所有點。可以發現 i 到 ...