1. 程式人生 > 實用技巧 >複習筆記(不定期更新)

複習筆記(不定期更新)

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 }