複習筆記(不定期更新)
阿新 • • 發佈:2020-07-31
Day1:
圖論三大法:
1.Dij+堆優化
dij的核心思想
以起始點為中心向外層層擴充套件,直到擴充套件到終點為止
簡單來說:
1.dij以節點距源點的遠近為依據,將其分為一層一層,一個節點便是一層
2.我們來看其流程: a.首先找出距源點S最近的節點A,搜尋A的所有出點,判斷能否通過S--A點邊使S到A的出點的距離減小,當A的所有出點搜尋完後,該層擴充套件完畢
b. 找出距源點S次近的節點B,搜尋B的所有出點,判斷能否通過S--B使S到B的出點的距離減小,當B的所有出點搜尋完後,該層擴充套件完畢
c.之後的點依次這樣擴充套件,當擴充套件到終點時,演算法結束
程式碼:
1 priority_queue<pair<int,int> > q;
2 void Dij(int s){
3 q.push(make_pair(0,s));memset(vis,0,sizeof(vis));memset(dis,20040429,sizeof(dis));
4 while (!q.empty()){
5 int x=q.top().second;
6 q.pop();
7 if (vis[x]) continue;
8 vis[x]=1;
9 for (int i = head[x];i;i=ed[i].next){
10 int to=ed[i].to;
11 if (dis[to]>dis[x]+ed[i].w){
12 dis[ti]=dis[x]+ed[i].w;
13 q.push(make_pair(-dis[to],to));
14 }
15 }
16 }
17 return;
18 }
例題:luogu單元最短路(傳送門)
毫無技巧的板子,程式碼:
1 #include <iostream>
2 #include <cstdio>
3 #include <algorithm>
4 #include <cmath>
5 #include <queue>
6 #include <cstring>
7 using namespace std;
8 priority_queue<pair<long long,long long> >q;
9 const int maxn=500005;
10 long long tot,head[maxn];
11 long long vis[maxn],dis[maxn];
12 int read(){
13 int x = 1,a = 0;
14 char ch = getchar();
15 while(ch < '0' || ch > '9'){
16 if(ch == '-')x = -1;
17 ch = getchar();
18 }
19 while(ch <= '9'&&ch >= '0'){
20 a = a * 10 + ch - '0';
21 ch = getchar();
22 }
23 return x*a;
24 }
25 struct node{
26 long long w,to,next;
27 }ed[maxn];
28 void add(long long u,long long to,long long w){
29 ed[++tot].next=head[u];
30 ed[tot].to=to;
31 ed[tot].w=w;
32 head[u]=tot;
33 }
34 void Dij(long long s){
35 q.push(make_pair(0,s));memset(vis,0,sizeof(vis));memset(dis,63,sizeof(dis));dis[s]=0;
36 while (!q.empty()){
37 long long x=q.top().second;
38 q.pop();
39 if (vis[x]) continue;
40 vis[x]=1;
41 for (long long i = head[x];i;i=ed[i].next){
42 long long to=ed[i].to;
43 if (dis[to]>dis[x]+ed[i].w){
44 dis[to]=dis[x]+ed[i].w;
45 q.push(make_pair(-dis[to],to));
46 }
47 }
48 }
49 return;
50 }
51 long long n,m,s;
52 long long u,v,w;
53 int main(){
54 n=read(),m=read(),s=read();
55 for (long long i = 1;i <= m;i++){
56 u=read(),v=read(),w=read();
57 add(u,v,w);
58 }
59 Dij(s);
60 for (long long i = 1;i <= n;i++) cout<<dis[i]<<" ";
61 return 0;
62 }