专题四总结
专题四图算法,到目前为止学习了并查集,最小生成树,最短路。
并查集找父节点:
int find(int x)
{
return p[x]==x?x:p[x]=find(p[x]);
}
练习四1003
另一种:
int find(int a)
{
if(f[a]==a) return a;
int tmp=f[a];
f[a]=find(f[a]);
nbo[a]+=nbo[tmp]; //记录父节点个数
return f[a];
}
练习四1022
最小生成树只会用kruscul算法,用这一个能做不少题了也就懒得学primer.
double kru()
{
double sum=0;
for(int i=0;i<k;i++)
{
int c=find(b[i].s),d=find(b[i].e);
if(c!=d)
{
p[c]=d;
sum+=b[i].w;
}
}
return sum;
}
练习四1002
最短路会两种dijkstra和Floyd。
Dijstra:
int dijk()
{
for(int i=1;i<=n;i++)
{
dis[i]=map[1][i];
}
for(int i=1;i<=n;i++)
{
int mind=t,k;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]<mind)
{
mind=dis[j];
k=j;
}
}
vis[k]=1;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&map[k][j]!=t&&dis[j]>dis[k]+
map[k][j])
dis[j]=dis[k]+map[k][j];
}
}
return dis[n];
}
练习四1009
这个专题赶上了期末考试复习,考完试再补上,要补的东西不少。