然后下面是最短路的算法
目录
最短路
最短路是从最小的一个点出发,不断地与其相连的最小的点合并直到所有点合并完成为止的一个算法。
其代码是:
int floyd(int x)
{
int i,j,k;
for(k=0;k<=x;k++)
{
for(i=0;i<=x;i++)
{
for(int j=0;j<=x;j++)
{
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);//搜寻更短路径
}
}
}
}
最小生成树
简单的说,就是不要让他们成环就好了。
int Find(int x)
{
if(f[x]==x)
return x;
else
{
f[x]=Find(f[x]);
return f[x];
}
}
bool cmp(point a,point b)
{
return a.w>b.w;
}
void mer(int a,int b)
{
int a1=Find(a);
int b1=Find(b);
if(a1!=b1)
{
f[b1]=a1;
}
return ;
}
int krusal(int m)
{
sort(points,points+m,cmp);
long long ans=0;
for(int i=0;i<m;i++)
{
int x=Find(points[i].x);
int y=Find(points[i].y);
if(x!=y)
{
mer(x,y);
ans+=points[i].w;
l++;
}
else
continue;
}
return ans;
}
素数
素数表
void prime()//素数打表
{
memset(f,true,sizeof(f));
f[0]=f[1]=false;
for(int i=2;i<=10005;i++)
{
if(f[i])
{
for(int j=2*i;j<=10005;j=j+i)
{
f[j]=false;
}
}
}
return;
}
快速幂
用二进制来进行计算,可以大大减少时间复杂度
ll Quickmul(ll a,ll b)
{
ll ans=1;
ll m=b;
while(m)
{
if(m&1/*等价于m%2==1*/)
{
ans=(ans*a)%b;
}
a=(a*a)%b;
m>>=1;//等价于m=m/2;
}
return ans;