求多個起點多個終點的最短路,與dij求單源最短路相似,將起點集push進入優先佇列,終點集標記,最先遇到的就是最短路
在乙個集合中找出兩個點距離最短,
二進位制列舉起點集與終點集,目的是使每個點與其他點不再乙個集合當中(巧妙利用二進位制位實現)
1 #include 2 #include3 #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個正整...