uva--216+dfs
来源:互联网 发布:大尺度网络剧 编辑:程序博客网 时间:2024/06/05 05:46
题意:
平面上给定几个点,求将这几个点联通起来的最小生成树,并输出最小生成树每条边的权值和总的最小代价。
思路:
因为点数最多为8所以没用最小生成树,而是直接穷举起点然后进行dfs求出一颗最小生成树。
注意:
注意输出格式,然后对自己定义的数组要明确含义。
代码如下:
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;typedef struct{ int x,y;}P;P p[10],p1;int ans[10],n,vis[10],temp[10];double sum;double dist(P p1, P p2){ double x=(p1.x-p2.x)*(p1.x-p2.x); double y=(p1.y-p2.y)*(p1.y-p2.y); return sqrt(x+y);}void dfs(int x,int num,double len){ int i; if(num==n) { if(sum>len) { sum=len; for(i=0;i<n;i++) ans[i]=temp[i]; } return ; } for(i=0;i<n;i++) { if(!vis[i]) { vis[i]=1; temp[num]=i; dfs(i,num+1,len+dist(p[x],p[i])); vis[i]=0; } }}int main(){ int i,j,k,Case=0; while(scanf("%d",&n)&&n) { sum=1000000+0.0; for(i=0;i<n;i++) scanf("%d%d",&p[i].x,&p[i].y); for(i=0;i<n;i++) { memset(vis,0,sizeof(vis)); vis[i]=1; temp[0]=i; dfs(i,1,0); } printf("**********************************************************\n"); printf("Network #%d\n",++Case); for(i=1;i<n;i++) { double len=dist(p[ans[i-1]],p[ans[i]]); printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2lf feet.\n", p[ans[i-1]].x,p[ans[i-1]].y,p[ans[i]].x,p[ans[i]].y,len+16); } printf("Number of feet of cable required is %.2lf.\n",sum+(n-1)*16); } return 0;}
0 0
- uva--216+dfs
- 【DFS】UVA
- 【DFS】UVA
- UVA 216 Getting in Line dfs
- uva 784(dfs)
- dfs uva-297-Quadtrees
- UVA 10318 简单dfs
- uva 11218 KTV(DFS)
- uva 301 Transportation (DFS)
- UVA 185(暴力DFS)
- UVA 11218 - KTV DFS
- uva 1267 - Network(dfs)
- uva 669 - Defragment(dfs)
- uva 10609 - Fractal(dfs)
- uva 784(dfs)
- Oil Deposits uva DFS
- XYZZY uva BFS+DFS
- Bicoloring uva DFS
- hadoop job调优
- AndroidManifest.xml主要包含的功能
- C_基础概念篇
- poj 3061 尺取法
- matlab simulink系统仿真流程
- uva--216+dfs
- Android 百度地图开发(一)--- 申请API Key和在项目中显示百度地图
- 基本概念总结
- Android Sqlite简单增删查改
- 运算优先级、结合性、求值顺序、副作用和顺序点
- android.view.viewroot$calledfromwrongthreadexception: only the original thread that created a view h
- 验证码
- SQLITE数据表主键设置Id自增方法
- cocos2d-x速度效率问题