hdu3072
阿新 • • 發佈:2018-12-31
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); } }