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
原创粉丝点击