基础算法板
二分:
查看代码
bool check(int x) int l=1,r=n,ans=0; while(l<=r){ int mid=(l+r)>>1; if(check(mid)){ ans=mid; r=mid-1; } else l=mid+1; }
归并排序:
查看代码
void mergesort(int a[],int l,int r){ if (l>=r) return; int mid=(l+r)>>1; mergesort(a,l,mid); mergesort(a,mid+1,r); int k=0,i=l,j=mid+1; while(i<=mid&&j<=r){ if(q[i]<=q[j]) tmp[k++]=a[i++]; else tmp[k++]=a[j++]; } while(i<=mid) tmp[k++]=a[i++]; while(j<=r) tmp[k++]=a[j++]; for(i=l,j=0;i<=r;i++) a[i]=tmp[j++]; }
快速幂:
查看代码
int quickmi(int a,int b,int mod){ int ans=1; while(b){ if(b&1) ans=ans*a%mod; a=a*a%mod; b>>=1; } return ans; }
离散化:
查看代码
int n,a[N],b[N]; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); b[i]=a[i]; } sort(a+1,a+1+n); int len=unique(a+1,a+1+n)-a-1; for(int i=1;i<=n;i++) b[i]=lower_bound(a+1,a+1+len,b[i])-a; for(int i=1;i<=n;i++) printf("%d",b[i]); return 0; }
并查集:
查看代码
int find(int x){ if(x==fa[x]) return fa[x]; return fa[x]=find(fa[x]); }
最小生成树:(kruskal)
查看代码
void Kruskal(){ sort(e+1,e+1+m);//按边权从小到大排序 for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<=m;i++){ int fx=find(e[i].x); int fy=find(e[i].y); if(fx==fy) continue; fa[fy]=fx; ans+=e[i].z; } }
矩阵乘:
查看代码
例:矩阵A*B #include <bits/stdc++.h> #define int long long using namespace std; const int N=110; int n,m,p,x,y,mod=0x7fffffff; struct stu{ int n,m; int a[N][N]; void zero(){ memset(a,0,sizeof(a)); } void resize(int x,int y){ n=x; m=y; } stu operator *(const stu &A) const{ stu ans; ans.resize(n,A.m); ans.zero(); for(int i=1;i<=n;i++){ for(int j=1;j<=A.m;j++){ for(int k=1;k<=m;k++){ ans.a[i][j]=(a[i][k]*A.a[k][j]+ans.a[i][j])%mod; } } } return ans; } void output(){ for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cout<<a[i][j]<<' '; } cout<<endl; } } }; signed main(){ ios::sync_with_stdio(true); stu mat; stu may; cin>>n>>m; mat.resize(n,m); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>mat.a[i][j]; } } cin>>p; may.resize(m,p); for(int t=1;t<=m;t++){ for(int k=1;k<=p;k++){ cin>>may.a[t][k]; } } stu q; q=mat*may; q.output(); return 0; }
dfs:
查看代码
#include <bits/stdc++.h> using namespace std; const int N=110; int n,m,g[N][N]; bool vis[N]; void dfs(int x){ vis[x]=true; printf("%d ",x); for(int i=1;i<=n;i++) if(!vis[i]&&g[x][i]) dfs(i); } int main(){ int x=0,y=0; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ scanf("%d%d",&x,&y); g[x][y]=g[y][x]=1; } dfs(1); return 0; }
bfs:
查看代码
#include <bits/stdc++.h> using namespace std; const int N=110; int n,m,g[N][N]; bool vis[N]; queue<int> q; void bfs(int x){ q.push(x); vis[x]=true; while(q.size()){ int t=q.front(); printf("%d ",t); q.pop(); for(int i=1;i<=n;i++){ if(!vis[i]&&g[t][i]){ q.push(i); vis[i]=true; } } } } int main(){ int x=0,y=0; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ scanf("%d%d",&x,&y); g[x][y]=g[y][x]=1; } bfs(1); return 0; }
floyd:
查看代码
memset(dis,0x3f,sizeof(dis)); for(int i=1;i<=n;i++) dis[i][i]=0; void floyd(){ for(int k=1;i<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); } } } }
dijkstra:(堆优化)
查看代码
void add(int x,int y,int z){ to[++tot]=y; edge[tot]=z; nxt[tot]=head[x]; head[x]=tot; } void dijkstra(int x){ memset(dis,0x3f,sizeof(dis)); dis[x]=0; q.push(make_pair(0,x)); while(q.size()){ int x=q.top().second; q.pop(); if(vis[x]) continue; vis[x]=1; for(int i=head[x];i;i=nxt[i]){ int y=to[i],z=edge[i]; if(dis[y]>dis[x]+z){ dis[y]=dis[x]+z; q.push(make_pair(-dis[y],y)); } } } }
spfa:
查看代码
void add(int x,int y,int z){ to[++tot]=y; nxt[tot]=head[x]; edge[tot]=z; head[x]=tot; } void spfa(int x){ memset(dis,0x3f,sizeof(dis)); dis[x]=0; queue<int> q; q.push(x); vis[x]=1; while(q.size()){ int x=q.front(); q.pop(); vis[x]=0; for(int i=head[x];i;i=nxt[i]){ int y=to[i],z=edge[i]; if(dis[y]>dis[x]+z){ dis[y]=dis[x]+z; if(!vis[y]){ q.push(y); vis[y]=1; } } } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】