dfs 找环
void dfs(int x,int fa1)
{
dfn[x]=++tim;
for(int i=ln[x];i;i=a[i].next)
{
int y=a[i].to
if(y==fa1) continue;
if(dfn[y])
{
if(dfn[y]<dfn[x]) continue;
ring[++ring[0]]=x;
for(;y!=x;y=fa[y]) ring[++ring[0]]=y;
}
else fa[y]=x,dfs(y,x);
}
}
附图
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201116203232142.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1NTE2NjY5,size_16,color_FFFFFF,t_70#pic_center)
KMP
#include<bits/stdc++.h>
using namespace std;
const int N=1000020;
char s1[N],s2[N];
int n,m;
int p[N];
void pre()
{
p[1]=0;
int j=0;
for(int i=1;i<=m;i++)
{
while(j>0&&s2[j+1]!=s2[i+1]) j=p[j];
if(s2[j+1]==s2[i+1]) j++;
p[i+1]=j;
}
}
void find()
{
int j=0;
for(int i=0;i<=n;i++)
{
if(i>=3) cout<<"A";
while(j>0&&s2[j+1]!=s1[i+1]) j=p[j];
if(s2[j+1]==s1[i+1]) j++;
if(j==m)
{
cout<<i+1-m+1<<endl;
j=p[m];
}
}
}
int main()
{
cin>>s1+1; cin>>s2+1;
n=strlen(s1+1);m=strlen(s2+1);
pre();
find();
for(int i=1;i<=m;i++) cout<<p[i]<<" ";
return 0;
}
线性筛素数
#include<bits/stdc++.h>
using namespace std;
const int N=10000020;
int f[N],vis[N];
int n;
int pre[N];
void prr(int n)
{
memset(vis,0,sizeof(vis));
int m=0;
for(int i=2;i<=n;i++)
{
if(!vis[i]) {vis[i]=i;pre[++m]=i;}
for(int j=1;j<=m;j++)
{
if(pre[j]>vis[i]||pre[j]>n/i) break;
vis[i*pre[j]]=pre[j];
}
}
}
int main()
{
cin>>n;
prr(n);
int num;
cin>>num;
for(int i=1;i<=num;i++)
{
int xx;
cin>>xx;
if(vis[xx]==xx) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
*/
#include<bits/stdc++.h>
using namespace std;
const int N=10000020;
int pre[N]={};
int n,m;
bool vis[N];
int main()
{
cin>>n;
pre[++m]=2;
for(int i=2;i<=n;i++)
{
if(!vis[i]) pre[++m]=i;
for(int j=1;j<=m&&i*pre[j]<=n;j++)
{
vis[i*pre[j]]=1;
if(i%pre[j]==0) break;
}
}
cin>>m;
for(int i=1;i<=m;i++)
{
int xx;
cin>>xx;
if(!vis[xx]) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
最小生成树
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y,z;
}dp[200020];int f[5020];
bool operator <(node a,node b){return a.z<b.z;}
int getfather(int x){return x==f[x]?x:f[x]=getfather(f[x]);}
int n,m;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) f[i]=i;
for(int i=1;i<=m;i++)
cin>>dp[i].x>>dp[i].y>>dp[i].z;
sort(dp+1,dp+1+m);
int ans=0;
for(int i=1;i<=m;i++)
{
int fx=getfather(dp[i].x),fy=getfather(dp[i].y);
if(fx==fy) continue;
f[dp[i].x]=f[fx]=fy;
ans+=dp[i].z;
}
int nnn=f[1];
for(int i=1;i<=n;i++)
{
if(f[i]!=nnn)
{
cout<<"orz";
return 0;
}
}
cout<<ans;
return 0;
}
单元最短路
#include<bits/stdc++.h>
using namespace std;
const int N=100020;
const int M=200020;
const int Max=2147483647;
int n,m,Bit;
long long w[M],lin[M],dis[N],vis[N],tot=0;
inline int read()
{
int x=0,w=0;char ch=0;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return w?-x:x;
}
struct node1{
long long y,next,z;
}a[M];
struct node
{
long long w,now;
inline bool operator <(const node &x)const
{
return w>x.w;
}
};
priority_queue<node>q;
void add(int x,int y,int z)
{ a[++tot].next=lin[x];lin[x]=tot;a[tot].y=y;a[i].z=z; }
inline void search()
{
for(int i=1;i<=n;i++)dis[i]=Max;
dis[Bit]=0;
q.push((node){0,Bit});
while(!q.empty())
{
node x=q.top();
q.pop();
int u=x.now;
if(vis[u])continue;
vis[u]=1;
for(int i=lin[u];i;i=a[i].next)
{
int v=a[i].y;
if(dis[v]>dis[u]+a[i].z)
{
dis[v]=dis[u]+a[i].z;
q.push((node){dis[v],v});
}
}
}
}
int main()
{
n=read();m=read();Bit=read();
for(int i=1;i<=m;i++)
{
int x=read(),y=read(),z=read();
add(x,y,z);
}
search();
for(int i=1;i<=n;i++)
cout<<dis[i]<<" ";
return 0;
}
SPFA
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
const int M=5e5+10;
const long long Max=(1LL<<31)-1;
struct node{
int next,to;
long long w;
}a[M];
int ln[N],tot;
int n,m,Bit;
inline void add(int x,int y,int z)
{a[++tot].next=ln[x];ln[x]=tot; a[tot].to=y;a[tot].w=z;}
inline int read()
{
int num=0,f=1; char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=getchar();}
while(ch>='0'&&ch<='9') {num=(num<<1)+(num<<3)+ch-'0'; ch=getchar();}
return num*f;
}
int q[M<<1],l=1,r=0;
long long dis[N],vis[N],cnt[N];
inline int SPFA()
{
for(int i=1;i<=n;i++) dis[i]=Max,cnt[i]=0;
q[++r]=Bit; cnt[Bit]++; vis[Bit]=1;dis[Bit]=0;
while(l<=r)
{
int x=q[l++];
vis[x]=0;
for(int i=ln[x];i;i=a[i].next)
{
int y=a[i].to,z=a[i].w;
if(dis[y]>dis[x]+z)
{
dis[y]=dis[x]+z;
cnt[y]++;
if(cnt[y]>n) return 1;
if(!vis[y])
{
q[++r]=y;
vis[y]=1;
}
}
}
}
}
int main()
{
n=read(),m=read(),Bit=read();
for(int i=1;i<=m;i++)
{
int x=read(),y=read(),z=read();
add(x,y,z);
}
SPFA();
for(int i=1;i<=n;i++) printf("%lld ",dis[i]);
return 0;
}