給你乙個
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 到 ...