POJ 3164 Command Network

來源:互聯網
上載者:User

最小樹形圖,朱劉演算法,步驟見下:

http://hi.baidu.com/goldengoatish/blog/item/a8e693d8aad5122611df9b2e.html/cmtid/0b36bd097aac9f980a7b8295

 

代碼:

#include<iostream><br />#include<cmath><br />using namespace std;<br />const int MAX=105;<br />const double inf=99999999.9;<br />int x[MAX],y[MAX],vis[MAX],pre[MAX],inCircle[MAX];<br />double g[MAX][MAX],minCost[MAX],ans;<br />int n,m,root;<br />double getDis(int i,int j)<br />{<br />double xx=x[i]-x[j],yy=y[i]-y[j];<br />return sqrt(xx*xx+yy*yy);<br />}<br />void dfs(int u)<br />{<br />vis[u]=1;<br />for(int v=1;v<=n;v++)<br />{<br />if(!vis[v]&&g[u][v]!=inf)<br />dfs(v);<br />}<br />}<br />bool exist()<br />{<br />for(int i=1;i<=n;i++)<br />if(!vis[i])<br />return false;<br />return true;<br />}<br />int findCircle()<br />{<br />int i,j;<br />root=1;<br />pre[root]=root;<br />for(i=1;i<=n;i++)<br />{<br />if(!inCircle[i]&&i!=root)<br />{<br />pre[i]=i;<br />g[i][i]=inf;//消去自環<br />for(j=1;j<=n;j++)<br />{<br />if(!inCircle[j]&&g[j][i]<g[pre[i]][i])<br />{<br />pre[i]=j;<br />}<br />}<br />}<br />}<br /> for(i= 1;i<= n;++i)//判斷是否存在有向環<br /> {<br /> if(inCircle[i])<br />continue;<br /> memset(vis,false,sizeof(vis));<br /> int j= i;<br /> while(!vis[j])<br /> {<br /> vis[j]= true;<br /> j= pre[j];<br />}<br /> if(j==root)<br />continue;<br /> return j;</p><p>}<br />return -1;<br />}<br />void update(int t)//縮點<br />{<br />int i,j;<br />ans+=g[pre[t]][t];<br />for(i=pre[t];i!=t;i=pre[i])<br />{<br />inCircle[i]=1;//點i被縮掉,不存在<br />ans+=g[pre[i]][i];<br />}<br />for(i=1;i<=n;i++)<br />if(!inCircle[i]&&g[i][t]!=inf)<br />g[i][t]-=g[pre[t]][t];<br />for(j=pre[t];j!=t;j=pre[j])<br />{<br />for(i=1;i<=n;i++)<br />{<br />if(!inCircle[i]&&g[i][j]!=inf)<br />{<br />g[i][t]=min(g[i][t],g[i][j]-g[pre[j]][j]);<br />//g[t][j]=min(g[i][j],g[t][j]);<br />}<br />g[t][i]=min(g[j][i],g[t][i]);<br />}<br />}<br />}<br />void solve()<br />{<br />int i,t;<br />memset(inCircle,0,sizeof(inCircle));<br />while((t=findCircle())!=-1)<br />{<br />update(t);<br />}<br />for(i=1;i<=n;i++)<br />{<br />if(i!=root&&!inCircle[i])<br />ans+=g[pre[i]][i];<br />}<br />printf("%.2lf/n",ans);<br />}<br />int main()<br />{<br />int i,j;<br />while(scanf("%d%d",&n,&m)!=EOF)<br />{<br />memset(vis,0,sizeof(vis));<br />ans=0;<br />root=1;<br />for(i=1;i<=n;i++)<br />{<br />for(j=1;j<=n;j++)<br />g[i][j]=inf;<br />}<br />for(i=1;i<=n;i++)<br />scanf("%d%d",&x[i],&y[i]);<br />while(m--)<br />{<br />scanf("%d%d",&i,&j);<br />g[i][j]=getDis(i,j);<br />}<br />dfs(1);<br />if(!exist())<br />{<br />printf("poor snoopy/n");<br />continue;<br />}<br />else<br />solve();<br />}<br />return 0;<br />} 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.