南陽20~深搜

參考自:http://blog.csdn.net/niushuai666/article/details/6670370
http://www.myexception.cn/program/1972478.html
深搜:

是基於遞歸的搜索方式,它的特點是由一個狀態拓展一個狀態,然後不停拓展,直到找到目標或者無法繼續拓展結束一個狀態的遞歸。

基本格式:

#include <iostream>
#include <queue>
using namespace std; //這幾個頭文件必不可少

int main()
{
queue<類型(如int)> q; //使用前需定義一個queue變量,且定義時已經初始化
while(!q.empty()) q.pop(); //重複使用時,用這個初始化(空則返回1,不空返回0)
q.push(1); //進隊列
q.pop(); //出隊列
int v=q.front(); //得到隊首的值
int s=q.size(); //得到隊列裏元素個數

return 0;
}

AC代碼:


#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int pre[100005];
vector<int>v[100005];

void DFS(int cur)
{
    for(int i = 0; i < v[cur].size(); ++i)
    {
        if(pre[v[cur][i]]) continue; //若存在父節點則繼續遍歷
        pre[v[cur][i]] = cur; //相連節點的父節點爲cur
        DFS(v[cur][i]); //深搜到底,把一條路上父節點全部找出
    }
}

int main()
{
    int ncase, num, cur, i, x, y;//cur爲S:參觀者所在城市的編號
    scanf("%d", &ncase);
    while(ncase--)
    {
        memset(v, 0, sizeof(v));
        memset(pre, 0, sizeof(pre));
        scanf("%d%d", &num, &cur);
        pre[cur] = - 1; //起點沒有父節點
        for(i = 0; i < num - 1; ++i)
        {
            scanf("%d%d", &x, &y);
            v[x].push_back(y); //x與y相連
            v[y].push_back(x); //y與x也肯定相連
        }
        DFS(cur); //起點開始深搜
        for(i = 1; i <= num; ++i)
            printf("%d ", pre[i]); //每個節點的父節點都保存在pri數組,輸出即可
    }
    return 0;
}

因爲給定的城市N的數目太大,建立數組需要用到#include< vector>,vector就是一個不定長數組,vector< int>a就是一個類似於int a[]的整數數組,只不過他的長度不確定,可以用a.size()讀取他的長度。
而vector< int>a[max]就是一個二維數組,只是第一維的大小是固定的(不超過max),二維的大小就不固定了,這道題之所以用到vector就是利用了他的不定長,如果直接建立二維數組a[n][n],n太大了,這樣的二維數組絕對超出內存。

發佈了47 篇原創文章 · 獲贊 6 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章