3072智能系统杭电
求完强连通分量求传递时
我搞的忒复杂,先用桥求出两个连通分量间最短路
再用深搜求所有连通分量的最短路
然后输出
for(int i=1; i<=ind; i++)
{
printf("对于%d和%d是第%d座\n",qi[i],zh[i],i);
ru[sccno[zh[i]]]=1;
printf("连通分量分别是%d和%d,后者有了入度,之间距离%d,但目前只有%d\n",sccno[qi[i]],sccno[zh[i]], lian[sccno[qi[i]]][sccno[zh[i]]],cos[qi[i]][zh[i]]);
lian[sccno[qi[i]]][sccno[zh[i]]]=min(lian[sccno[qi[i]]][sccno[zh[i]]],cos[qi[i]][zh[i]]);
printf("所以连通分量%d和%d的距离变为距离%d\n",sccno[qi[i]],sccno[zh[i]], lian[sccno[qi[i]]][sccno[zh[i]]]);
}//处理桥
for(int i=1; i<=scnt; i++)
{
printf("%d的入度%d\n",i,ru[i]);
if(!ru[i])
{
printf("开始广搜%d\n",i);
d[i]=0;
bfs(i);
}
}//处理连通分量
int anss=0;
for(int i=1; i<=scnt; i++)
{
anss+=xu[i];
printf("%d的距离为%d,总距离%d\n",i,xu[i],anss);
}*///还有一段dfs代码
其实只要用桥就可以求出了,深搜免了
唯一的遗憾是不知道测试数据,怕有遗漏
for(int i=1; i<=ind; i++)
{
u=sccno[qi[i]];
v=sccno[zh[i]];
printf("连通分量分别是%d和%d之间距离%d\n",sccno[qi[i]],sccno[zh[i]], lian[sccno[qi[i]]][sccno[zh[i]]]);
if(u!=v){
printf("所以%d距离为%d,%d和%d花费%d\n",v,d[v],u,v,cos[qi[i]][zh[i]]);
d[v]=min(d[v],cos[qi[i]][zh[i]]);
printf("所以%d距离为%d\n",v,d[v]);
}
}
for(int i=1; i<=scnt; i++)
{
if(d[i]<1000){
ans+=d[i];
printf("%d的距离为%d,总距离%d\n",i,d[i],ans);
}
}