洛谷试炼场 普及常见模板

对没错我就是在水博

P3366 【模板】最小生成树

  kruskal:

 View Code

P3367 【模板】并查集

  

 1 /*by SilverN*/
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 using namespace std;
 8 const int mxn=210000;
 9 int read(){
10     int x=0,f=1;char ch=getchar();
11     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
12     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
13     return x*f;
14 }
15 int n,m;
16 int fa[mxn];
17 void init(){
18     for(int i=1;i<=n;i++){
19         fa[i]=i;
20     }
21 }
22 int find(int x){
23     if(fa[x]==x)return x;
24     return fa[x]=find(fa[x]);
25 }
26 int main(){
27     n=read();m=read();
28     init();
29     int x,y,z;
30     while(m--){
31         z=read();x=read();y=read();
32         x=find(x);
33         y=find(y);
34         if(z==1){
35             fa[x]=y;
36         }
37         else{
38             if(x==y){
39                 printf("Y
");
40             }
41             else printf("N
");
42         }
43     }
44     return 0;
45 }
View Code

P3371 【模板】单源最短路径

水这个模板题的时候,邻接表数组开小了,WA了五六次,悲伤。

 1 /*by SilverN*/
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 using namespace std;
 8 const int mxx=2147483647;
 9 const int mxn=540000;
10 int read(){
11     int x=0,f=1;char ch=getchar();
12     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
13     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
14     return x*f;
15 }
16 struct edge{
17     int v,dis;
18     int nxt;
19 }e[mxn];
20 int hd[mxn],mct=0;
21 void add_edge(int u,int v,int dis){
22     e[++mct].v=v;e[mct].dis=dis;e[mct].nxt=hd[u];hd[u]=mct;
23     return;
24 }
25 int n,m,s;
26 int dis[mxn];
27 bool inq[mxn];
28 int q[360010];
29 int vis[mxn];
30 int head=0,tl=1;
31 void spfa(){
32     for(int i=1;i<=n;i++){dis[i]=mxx;}
33     dis[s]=0;
34     q[++head]=s;
35     while(head!=tl+1){
36         int u=q[head];head=(head+1)%360000;inq[u]=0;
37         for(int i=hd[u];i;i=e[i].nxt){
38             int v=e[i].v;
39             if((long long)dis[u]+(long long)e[i].dis<(long long)dis[v]){
40                 dis[v]=dis[u]+e[i].dis;
41                 vis[v]++;
42                 if(vis[v]>n)return;
43                 if(!inq[v]){
44                     inq[v]=1;
45                     tl=(tl+1)%360000;
46                     q[tl]=v;
47                 }
48             }
49         }
50     }
51     return;
52 }
53 int main(){
54     n=read();m=read();s=read();
55     int i,j;
56     int u,v,d;
57     for(i=1;i<=m;i++){
58         u=read();
59         v=read();
60         d=read();
61         add_edge(u,v,d);
62     }
63     spfa();
64     for(i=1;i<=n;i++){
65         printf("%d ",dis[i]);
66     }
67     printf("
");
68     return 0;
69 }
View Code

P3383 【模板】线性筛素数

 1 /*by SilverN*/
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 using namespace std;
 8 int read(){
 9     int x=0,f=1;char ch=getchar();
10     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
11     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
12     return x*f;
13 }
14 const int mxn=10000005;
15 int pri[mxn>>1],cnt;
16 bool vis[mxn];
17 void PRI(int mxn){
18     vis[1]=1;
19     int i,j;
20     for(i=2;i<mxn;i++){
21         if(!vis[i])pri[++cnt]=i;
22         for(j=1;j<=cnt && i*pri[j]<mxn;j++){
23             vis[i*pri[j]]=1;
24             if(i%pri[j]==0)break;
25         }
26     }
27     return;
28 }
29 int n,m;
30 int main(){
31     n=read();m=read();
32     PRI(n+3);
33     int x;
34     while(m--){
35         x=read();
36         if(vis[x])printf("No
");
37         else printf("Yes
");
38     }
39     return 0;
40 }
View Code
原文地址:https://www.cnblogs.com/SilverNebula/p/5900772.html