hdu3072

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);
        }

    }

猜你喜欢

转载自blog.csdn.net/qq_43439240/article/details/85451969
今日推荐