$\huge \text{编程常用模板}$
1.读优/输优
快速读入模版
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
或
int read(int &n)
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
n=x*f;
}
快速输出模版
void wrtn(int x)
{
if(x<0) {putchar('-');x=-x;}
int y=10,len=1;
while(y<=x) {y*=10;len++;}
while(len--){y/=10;putchar(x/y+48);x%=y;}
putchar(' ');
}
2.图的连通性
Floyd
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(f[i][k]==1 && f[k][j]==1)
f[i][j]=1;
3.并查集
初始化
void init()
{
for(int i=1;i<=n;i++)
pre[i]=i;
}
查找
int find(int k)
{
if(pre[k]==k) return k;
return pre[k]=find(pre[k]);
}
合并
void join(int x,int y)
{
int fx=find(x),fy=find(y);
if(fx!=fy)
pre[fx]=fy;
}
4.背包
01背包
for(int i=1;i<=n;i++)
for(int j=v;j>=w[i];j--)
f[j]=max(f[j-w[i]]+v[i], f[j]);
完全背包
for(int i=1;i<=n;i++)
for(int j=w[i];j<=m;j++)
f[j]=max(f[j],f[j-w[i]]+c[i]);
多重背包
for(int i=1;i<=n;i++)
for(int j=m;j>=0;j--)
for(int k=1;k<=s[i];k++)
{
if(j-k*v[i]<0) break;
f[j]=max(f[j],f[j-k*v[i]]+k*w[i]);
}
5.最小生成树
kruskal
void kruskal()
{
for(int i=1;i<=m;i++)
{
if(find(a[i].x)==find(a[i].y)) continue;
ans+=a[i].z;
k++;
join(a[i].x,a[i].y);
if(k==n-1) break;
}
if(k<n-1)
{
cout<<"impossible";
return ;
}
else
cout<<ans;
return ;
}
退役……

浙公网安备 33010602011771号