UVA216 ——dfs
生活随笔
收集整理的這篇文章主要介紹了
UVA216 ——dfs
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
代碼如下,注釋很清楚,稍微學過數據結構的應該可以看懂
#include<iostream> #include<cmath> #include<cstring> #include<stdio.h> using namespace std; #define MAXNUM 9int x[MAXNUM],y[MAXNUM];//記錄坐標 double dis[MAXNUM][MAXNUM];//記錄兩點間距離,作為圖的鄰接矩陣 int ans_order[MAXNUM];//存儲dfs遍歷節點的順序 int tem_order[MAXNUM];//臨時存儲dfs遍歷節點的順序 double min_dis = 10000000;//最短距離 int visit[MAXNUM];//記錄節點是否被訪問 int n ;double distance(int x1,int y1,int x2,int y2){//兩點間距離return sqrt(pow( x1-x2 ,2)+pow(y1-y2,2)); }void dfs(int cur){//對圖進行第cur深度的深搜if ( cur == n ){//如果深度超過圖的節點個數,則對當前深搜所得到的連通圖進行判斷double sum = 0 ;for (int i = 0 ; i < n-1 ; i ++){//求當前所得連通圖的代價,即題目題目中的stepsum+=dis[tem_order[i]][tem_order[i+1]];}if (sum < min_dis){min_dis = sum ;memcpy(ans_order,tem_order,sizeof(tem_order));}}else{//對圖進行第cur深度的深搜for( int i = 0 ; i < n ; i++){//遍歷節點,找到下一個沒有被訪問的節點繼續深度搜索if(!visit[i]){visit[i] = 1 ;tem_order[cur] = i ;//當前深搜順序的第cur個節點是idfs(cur+1);//對圖進行第cur+1深度的深搜visit[i] = 0;//相當于該節點退棧}}}}int main (){int time = 0;while (cin>>n && n!=0){time ++ ;for (int i = 0 ; i < n ; i++){//輸入并計算距離scanf("%d %d",&x[i],&y[i]);visit[i] = 0 ;for (int j = 0 ; j < i ; j++){dis[i][j] = dis[j][i] = distance(x[j],y[j],x[i],y[i]);}}min_dis = 1000000;dfs(0);printf("**********************************************************\n");printf("Network #%d\n",time);for (int i = 0 ; i < n-1; i++){printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2lf feet.\n",x[ans_order[i]],y[ans_order[i]],x[ans_order[i+1]],y[ans_order[i+1]],dis[ans_order[i]][ans_order[i+1]]+16);}printf("Number of feet of cable required is %.2lf.\n",min_dis+16*(n-1));}return 0; }總結
以上是生活随笔為你收集整理的UVA216 ——dfs的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件工程的瀑布, 大泥球, 教堂,集市,
- 下一篇: 坚持使用GNU/Linux