模板复习

并查集

 1 /*
 2 problem:fuxi
 3 date:2019/5/26
 4 author:Lonely.Devil
 5 */
 6 
 7 #include<iostream>
 8 #include<cstdio>
 9 #include<cstring>
10 using namespace std;
11 const int maxn = 1e5+5;
12 int father[maxn];
13 int n,m;
14 inline int find(int x){
15     if(father[x] == x)return x;
16     return father[x] = find(father[x]);
17 }
18 int main(){
19     cin>>n>>m;
20     for(int i = 1;i <= n;i++)father[i] = i;
21     for(int i = 1,op,x,y;i <= m;i++){
22         scanf("%d%d%d",&op,&x,&y);
23         if(op == 1)
24             father[find(x)] = find(y);
25         else if(find(x) == find(y))puts("Y");
26              else puts("N");
27     }
28     return 0;
29 }

spfa

 1 /*
 2 problem:fuxi
 3 date:2019/5/26
 4 author:Lonely.Devil
 5 */
 6 
 7 #include<iostream>
 8 #include<cstdio>
 9 #include<queue>
10 using namespace std;
11 const int maxn = 1e5+5,maxm = 1e6+5,inf = 1e9+5;
12 priority_queue< pair<int,int> >q;
13 int dist[maxn],p[maxn],begin[maxn],next[maxm],to[maxm],w[maxm],e;
14 int n,m,s;
15 inline void add(int x,int y,int z){
16     next[++e] = begin[x];
17     begin[x] = e;
18     to[e] = y;
19     w[e] = z;
20 }
21 inline void spfa(){
22     for(int i = 1;i <= n;i++)dist[i] = inf;
23     dist[s] = 0;
24     q.push(make_pair(0,s));
25     while(!q.empty()){
26         int tmp = q.top().second;
27         q.pop();
28         if(p[tmp])continue;
29         p[tmp] = 1;
30         for(int i = begin[tmp];i;i = next[i]){
31             int x = to[i];
32             if(dist[x] > dist[tmp]+w[i])
33                 dist[x] = dist[tmp]+w[i],q.push(make_pair(-dist[x],x));
34         }
35     }
36 }
37 int main(){
38     cin>>n>>m>>s;
39     for(int i = 1,x,y,z;i <= m;i++){
40         scanf("%d%d%d",&x,&y,&z);
41         add(x,y,z);
42     }
43     spfa();
44     for(int i = 1;i <= n;i++)
45         printf("%d%c",dist[i] == inf ? 2147483647 : dist[i],i == n ?'
' : ' ');
46     return 0;
47 }

dijkstra

 1 /*
 2 problem:fuxi
 3 date:2019/5/26
 4 author:Lonely.Devil
 5 */
 6 
 7 #include<bits/stdc++.h>
 8 using namespace std;
 9 const int maxn = 1e5+5,inf = 1e9;
10 struct node{
11     int to,w;
12 };
13 vector<node>e[maxn];
14 int d[maxn],p[maxn];
15 int n,m,s;
16 inline void add(int x,int y,int z){
17     node t;
18     t.to = y;
19     t.w = z;
20     e[x].push_back(t);
21 }
22 inline void dijkstra(){
23     for(int i = 1;i <= n;i++)d[i] = inf;
24     d[s] = 0;
25     for(int i = 1;i <= n;i++){
26         int mins = inf,k;
27         for(int j = 1;j <= n;j++)
28             if(!p[j] && d[j] < mins){
29                 mins = d[j];k=j;
30             }
31         p[k]=1;
32         for(int j = 0;j < e[k].size();j++){
33             node v = e[k][j]; 
34             if(d[v.to] > d[k]+v.w)d[v.to] = d[k]+v.w;
35         } 
36     }
37 }
38 int main(){
39     cin>>n>>m>>s;
40     for(int i=1,x,y,z;i<=m;i++){        
41         scanf("%d%d%d",&x,&y,&z);
42         add(x,y,z);
43     }
44     dijkstra();
45     for(int i = 1;i <= n;i++)
46         if(d[i] < inf)printf("%d ",d[i]);
47         else printf("2147483647 ");
48     return 0;
49 }

Floyd

 1 /*
 2 problem:fuxi
 3 date:2019/5/26
 4 author:Lonely.Devil
 5 */
 6 
 7 #include<iostream>
 8 #include<cstdio>
 9 using namespace std;
10 const int maxn = 1e4,inf = 1e9+5;
11 int dist[maxn][maxn];
12 int n,m,s;
13 inline void Floyd(){
14     for(int k = 1;k <= n;k++)
15         for(int i = 1;i <= n;i++)
16             for(int j = 1;j <= n;j++)
17                 if(dist[i][j] > dist[i][k]+dist[k][j])
18                     dist[i][j] = dist[i][k]+dist[k][j]; 
19 }
20 int main(){
21     cin>>n>>m>>s;
22     for(int i = 1;i <= n;i++)
23         for(int j = 1;j <= n;j++)
24             if(i == j)dist[i][j] = 0;
25             else dist[i][j] = inf;
26     for(int i = 1,x,y,z;i <= m;i++){
27         scanf("%d%d%d",&x,&y,&z);
28         if(dist[x][y] != 0)dist[x][y] = min(z,dist[x][y]);
29         else dist[x][y] = z;
30     }
31     dist[s][s] = 0;
32     Floyd();
33     for(int i = 1;i <= n;i++)
34             if(dist[s][i] < inf)printf("%d ",dist[s][i]);
35             else printf("2147483647 ");
36     return 0;
37 }

堆排序

 1 /*
 2 problem:fuxi
 3 date:2019/5/26
 4 author:Lonely.Devil
 5 */
 6 
 7 #include<iostream>
 8 #include<cstdio>
 9 using namespace std;
10 int n,len;
11 int a[11100000];
12 inline void insert(int x){
13     a[++len] = x;
14     int k = len,tmp;
15     while(k > 1 && a[k] < a[k>>1]){
16         tmp = a[k];a[k] = a[k>>1];a[k>>1] = tmp;
17         k >>= 1;
18     }
19 }
20 int main(){
21     cin>>n;
22     for(int i = 1,k;i <= n;i++)scanf("%d",&k),insert(k);
23     for(int i = 1,t,tmp,k;i <= n;i++){
24         printf("%d ",a[1]);
25         a[1] = a[len];
26         len--;
27         k = 1;
28         while((a[k] > a[k<<1] && k<<1 <= len) || (a[k] < a[k<<1|1] && k<<1|1 <= len)){
29             tmp = k<<1;
30             if(a[tmp] > a[tmp+1] && tmp+1 <= len)tmp++;
31             t = a[k];a[k] = a[tmp];a[tmp] = t;
32             k = tmp;
33         }
34     }
35     return 0;
36 }

Prim

 1 /*
 2 problem:fuxi
 3 date:2019/5/26
 4 author:Lonely.Devil
 5 */
 6 
 7 #include<iostream>
 8 #include<cstdio>
 9 #include<cstring>
10 using namespace std;
11 const int maxn=2e5+5,maxm=12e5+5,inf=1000000000;
12 int e,to[maxm],w[maxm],begin[maxn],next[maxm];
13 int d[maxn],p[maxn],q[maxn],pos[maxn],ans,m,n,l;
14 void add(int x,int y,int z){
15     to[++e] = y;
16     next[e] = begin[x];
17     begin[x] = e;
18     w[e] = z;
19 }
20 inline void Prim(){
21     for(int i = 1;i <= n;i++)d[i] = inf;
22     d[1] = 0;l = n;
23     for(int i = 1;i <= n;i++){q[i]=i;pos[i]=i;}
24     for(int i = 1,k,u,v;i <= n;i++){
25         int tmp;
26         k = q[1];
27         q[1] = q[l];pos[q[l]] = 1;l--;
28         u = 1;
29         while((u*2 <= l && d[q[u]] > d[q[2*u]]) || (u*2+1 <= l && d[q[u]] > d[q[2*u+1]])){
30             v = u*2;
31             if(v+1 <= l && d[q[v]] > d[q[v+1]])v++;
32             tmp = q[u];q[u] = q[v];q[v] = tmp;
33             tmp = pos[q[u]];pos[q[u]] = pos[q[v]];pos[q[v]] = tmp;
34             u = v;
35         }
36         p[k] = 1;
37         ans += d[k];
38         for(int j = begin[k];j;j = next[j]){
39             u = to[j];
40             if(!p[u] && d[u] > w[j])d[u] = w[j];
41             v = pos[u];
42             while(v >= 1 && d[q[v]] < d[q[v/2]]){
43                 tmp = q[v];q[v]=q[v/2];q[v/2] = tmp;
44                 tmp = pos[q[v]];pos[q[v]] = pos[q[v/2]];pos[q[v/2]] = tmp;
45                 v = v/2;
46             }
47         }
48     }
49 }
50 int main(){
51     scanf("%d%d",&n,&m);
52     for(int i = 1,x,y,z;i <= m;i++){
53         scanf("%d%d%d",&x,&y,&z);
54         add(x,y,z);
55         add(y,x,z);                
56     }
57     Prim();
58     printf("%d
",ans);    
59     return 0;
60 }

Kruscal

 1 /*
 2 problem:fuxi
 3 date:2019/5/26
 4 author:Lonely.Devil
 5 */
 6 
 7 #include<iostream>
 8 #include<cstdio>
 9 #include<algorithm>
10 using namespace std;
11 const int maxn = 2e5+5;
12 struct edge{
13     int x,y,z;
14 }e[maxn];
15 int father[maxn];
16 int n,m,cnt,sum;
17 inline bool cmp(edge a,edge b){
18     return a.z < b.z;
19 }
20 inline int find(int x){
21     if(father[x] == x)return x;
22     return father[x] = find(father[x]);
23 }
24 inline void Kruscal(){
25     sort(e+1,e+1+m,cmp);
26     for(int i = 1;i <= n;i++)father[i] = i;
27     for(int i = 1;i <= m;i++){
28         if(find(e[i].x) != find(e[i].y)){
29             sum += e[i].z;
30             cnt++;
31             father[find(e[i].x)] = find(e[i].y);
32         }
33         if(cnt == n-1)break;
34     }
35 }
36 int main(){
37     cin>>n>>m;
38     for(int i = 1,x,y,z;i <= m;i++)
39         scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].z);
40     Kruscal();
41     cout<<sum<<endl;
42     return 0;
43 }

tree1

 1 /*
 2 problem:fuxi
 3 date:2019/5/26
 4 author:Lonely.Devil
 5 */
 6 
 7 #include<iostream>
 8 #include<cstdio>
 9 using namespace std;
10 const int maxn = 5e5+5;
11 int tree[maxn<<2];
12 int n,m;
13 inline int lowbit(int x){
14     return x & -x;
15 }
16 inline void add(int x,int val){
17     while(x <= n){
18         tree[x] += val;
19         x += lowbit(x);
20     }
21 }
22 inline int ask(int x){
23     int res = 0;
24     while(x){
25         res += tree[x];
26         x -= lowbit(x);
27     }
28     return res;
29 }
30 int main(){
31     cin>>n>>m;
32     int a;
33     for(int i = 1;i <= n;i++)scanf("%d",&a),add(i,a);
34     for(int i = 1,op,x,y;i <= m;i++){
35         scanf("%d%d%d",&op,&x,&y);
36         if(op == 1)add(x,y);
37         if(op == 2)printf("%d
",ask(y)-ask(x-1));
38     }
39     return 0;
40 }

tree2

 1 /*
 2 problem:fuxi
 3 date:2019/5/26
 4 author:Lonely.Devil
 5 */
 6 
 7 #include<iostream>
 8 #include<cstdio>
 9 using namespace std;
10 const int maxn = 5e5+5;
11 int tree[maxn];
12 int n,m,now,a;
13 inline int lowbit(int x){
14     return x & -x;
15 }
16 inline void add(int x,int val){
17     while(x <= n){
18         tree[x] += val;
19         x += lowbit(x);
20     }
21 }
22 inline int ask(int x){
23     int res = 0;
24     while(x){
25         res += tree[x];
26         x -= lowbit(x);
27     }
28     return res;
29 }
30 int main(){
31     cin>>n>>m;
32     for(int i = 1;i <= n;i++)scanf("%d",&a),add(i,a-now),now = a;
33     for(int i = 1,op,x,y,z;i <= m;i++){
34         scanf("%d",&op);
35         if(op == 1)scanf("%d%d%d",&x,&y,&z),add(x,z),add(y+1,-z);
36         if(op == 2)scanf("%d",&x),printf("%d
",ask(x));
37     }
38     return 0;
39 }
原文地址:https://www.cnblogs.com/wangyifan124/p/10928533.html