基础算法板

二分:

查看代码
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;
}
}
}
}
}

 

posted @   __kw  阅读(21)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示