hdu 1865 畅通工程再续
2013-11-15 10:18
204 查看
最小生成树,用Prim算法。
#include <iostream> #include<stdio.h> #include<cstring> #include<queue> #include<math.h> using namespace std; const double INF=100000000.0; int visit[110]; double d[110],w[110][110]; struct { int x,y; } re[110]; int main() { int n,cas,r,i,j,ok=0; double min; //之前写成int了,wa了我一晚上,想哭啊~~~~ scanf("%d",&cas); while(cas--) { scanf("%d",&n); //if(m==0) break; double ans=0.0; memset(visit,0,sizeof(visit)); for(i=1; i<=n; i++) { d[i]=(i==1?0:INF); for(j=1; j<=n; j++) { if(i==j)w[i][j]=0; else w[i][j]=INF; } } for(i=1; i<=n; i++) { scanf("%d %d",&re[i].x,&re[i].y); } if(n==1) ok=1; for(i=1; i<=n; i++) for(j=i+1; j<=n; j++) { // printf("aaa%lf\n",(re[i].x-re[j].x)*(re[i].x-re[j].x)); double xx=re[i].x-re[j].x; double yy=re[i].y-re[j].y; double dis=sqrt(xx*xx+yy*yy); if(dis<10.000000||dis>1000.000000) w[i][j]=w[j][i]=INF; else w[i][j]=w[j][i]=dis; } queue<int>q; q.push(1); int count=1; visit[1]=1; while(count<n) { // printf("count %d\n",count); min=INF; ok=0; int temp=q.front(); q.pop(); for(i=1; i<=n; i++) { if(visit[i]==0) { if(d[i]>w[temp][i]) d[i]=w[temp][i]; if(d[i]<min) { ok=1; min=d[i]; r=i; } } } if(ok==1) //说明有一条路小于INF { visit[r]=1; q.push(r); count++; ans+=d[r]; } else break; } if(ok==1)printf("%.1lf\n",ans*100); else printf("oh!\n"); } return 0; }
相关文章推荐
- hdu 1865 畅通工程再续
- HDU-1879-继续畅通工程(并查集)
- HDU - 1879 继续畅通工程(最小生成树kruskal)
- hdu 1879 继续畅通工程
- HDU-1863-畅通工程
- hdu1874 畅通工程续
- HDU 1863 畅通工程
- hdu 1874 畅通工程续(最短路的dijkstra算法实现&&Floyd算法实现)
- HDU 1232 畅通工程 最小强连通通路-并查集
- HDU-#1874 畅通工程续(Dijkstra、Floyd、SPFA)
- HDU 1233 还是畅通工程
- HDU 1874 畅通工程续 <Dijkstra模板题>
- 畅通工程 -HDU - 1863
- hdu 1232 畅通工程
- HDU 1232 畅通工程
- 继续畅通工程(HDU 1879)
- HDU 1232 畅通工程
- hdu 1874 畅通工程续
- HDU 1875 畅通工程再续(kruskal)
- hdu 1879:继续畅通工程