wenbao與多源多匯最短路

2022-04-17 04:20:52 字數 3569 閱讀 4032

求多個起點多個終點的最短路,與dij求單源最短路相似,將起點集push進入優先佇列,終點集標記,最先遇到的就是最短路

在乙個集合中找出兩個點距離最短,

二進位制列舉起點集與終點集,目的是使每個點與其他點不再乙個集合當中(巧妙利用二進位制位實現)

1 #include 2 #include 

3 #include 4

using

namespace

std;56

#define ll long long

7const

int maxn = 100009;8

const ll inf =1e18;

9int

n, m, q;

10int

to[maxn], pre[maxn], p[maxn], a[maxn], index;

11bool

vis[maxn], mark[maxn];

12ll dis[maxn], w[maxn];

1314

struct

node

20};

2122 priority_queuepq;

2324

void

init()29}

30ll dij());42}

43}44}

45return

inf;46}

4748

void

solve()else

);58}59

}60 sum =min(sum, dij());

61init();

62for(int j = 0; j < q; ++j));

66 }else69}

70 sum =min(sum, dij());71}

72 printf("

%lld\n

", sum);73}

7475

intmain()

88 scanf("

%d", &q);

89for(int i = 0; i < q; ++i)

92 printf("

case #%d:

", cas++);

93solve();94}

95return0;

96 }

spfa

1 #include "

iostream

"2 #include

3 #include 4 #include 5

using

namespace

std;67

#define ll long long

8const

int maxn = 1010;9

int n, m, s, t, from

, to, snum, tnum;

10ll t[maxn], val, sum;

11bool

mark[maxn];

12 vectora[maxn];

13 vectorb[maxn];

1415

void

init() 21}

2223

void add(int x, int

y, ll z) 30}

31a[x].push_back(y);

32b[x].push_back(z);33}

3435

void

spfa()

44while(!q.empty()) 54}

55}56for(int i = 0; i < tnum; ++i)60}

6162

intmain()

73 s = 0, t = m+1;74

spfa();

75 printf("

%lld\n

", sum);76}

77return0;

78 }

dij

1 #include "

iostream

"2 #include

3 #include 4

using

namespace

std;56

#define ll long long

7const

int maxn = 2020;8

const ll inf =1e18;

9int

n, snum, tnum;

10int

to[maxn], pre[maxn], p[maxn], a[maxn], index;

11bool

vis[maxn], mark[maxn];

12ll dis[maxn], w[maxn];

1314

struct

node

20};

2122 priority_queuepq;

2324

void

init() 29}

30ll dij() );43}

44}45}

46return

inf;47}

4849

void

solve() );56}

57for(int i = 0; i < tnum; ++i)

61 ll sum =dij();

62 printf("

%lld\n

", sum);63}

6465

intmain()

79solve();80}

81return0;

82 }

floyd

1 #include "

iostream"2

using

namespace

std;34

#define inf 1e9

5const

int maxn = 1010;6

inta[maxn][maxn], n, snum, tnum, x, y, z, b[maxn], c[maxn], sum, m;78

void

init() 14}

15}1617

void

floyd()

28for (int j = k + 1; j < i; j++) 32}

33}34}

3536

intmain()

48floyd();

49for(int i = 0; i < snum; ++i)

52for(int i = 0; i < tnum; ++i)

55for(int i = 0; i < snum; ++i) else62}

63}64 printf("

%d\n

", sum);65}

66return0;

67 }

只有不斷學習才能進步!

多源最短路

題目描述 已知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個正整...