1. 程式人生 > >hdu3072

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

    }