最小距離 多源最短路

2022-03-19 18:55:38 字數 1456 閱讀 9745

給定一張 \(n\) 個點 \(m\) 條邊的帶邊權連通無向圖,其中有 \(p\) 個點是特殊點。

對於每個特殊點,求出它到離它最近的其它特殊點的距離。

第一行三個整數 \(n,m,p\),第二行 \(p\) 個整數 \(x_1~x_p\) 表示特殊點的編號。接下來 \(m\) 行每行三個整數 \(u,v,w\) 表示一條連線 \(u\) 和 \(v\),長度為 \(w\) 的邊。

輸出一行 \(p\) 個整數,第 \(i\) 個整數表示 \(x_i\) 的答案。

樣例輸入

5 6 3

2 4 5

1 2 4

1 3 1

1 4 1

1 5 4

2 3 1

3 4 3

樣例輸出
3 3 5
對於 \(10\%\) 的資料,\(n,m<=50000,p<=10\) 。

對於 \(40\%\) 的資料,\(n,m<=50000\)。

對於另外 \(5\%\) 的資料,\(p=n\)。

對於 \(100\%\) 的資料,\(1<=n,m<=2e5,2<=p<=n,1<=x_i<=n\),\(x_i\) 互不相同,\(1<=u,v<=n,1<=w<=1e9\)。

又是乙個奇奇怪怪的最短路

#include#include#include#include#include#define n 400010

#define r register

#define int long long

using namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}int n,m,p,spl[n],head[n],f[n];

long long ans[n],dis[n];

bool vis[n],flag[n];

struct edgee[n<<1];

int len = 1;

void addedge(int u,int v,int w)

struct node

node(int _num,int _dis)

bool operator <(const node &a)const

};void dij()

while(!q.empty())

} }}signed main()

for(r int i = 1;i <= m;i++)

dij();

fill(ans+1,ans+1+n,1e18);

for(int i = 2;i <= len;i += 2)

} for(int i = 1;i <= p;i++)printf("%lld ",ans[spl[i]]);

return 0;

}

多源最短路

題目描述 已知n個點 n 100 給你n n的方陣,a i,j 表示從第i個點到第j個點的直接距離。現在有q個詢問,每個詢問兩個正整數,a和b,讓你求a到b之間的最短路程。滿足a i,j a j,i 輸入描述 第一行乙個正整數n,接下來n行每行n個正整數,滿足a i,i 0,再一行乙個q,接下來q行...

多源最短路

題目描述 已知n個點 n 100 給你n n的方陣,a i,j 表示從第i個點到第j個點的直接距離。現在有q個詢問,每個詢問兩個正整數,a和b,讓你求a到b之間的最短路程。滿足a i,j a j,i 輸入描述 第一行乙個正整數n,接下來n行每行n個正整數,滿足a i,i 0,再一行乙個q,接下來q行...

多源最短路

時間限制 1 s 空間限制 128000 kb 題目等級 gold 已知n個點 n 100 給你n n的方陣,a i,j 表示從第i個點到第j個點的直接距離。現在有q個詢問,每個詢問兩個正整數,a和b,讓你求a到b之間的最短路程。滿足a i,j a j,i 第一行乙個正整數n,接下來n行每行n個正整...