$\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 ;
}
posted @ 2019-07-22 18:28  Luke·Skywalker  阅读(447)  评论(0)    收藏  举报