SDUT OJ 數據結構實驗之圖論四:迷宮探索

                                          數據結構實驗之圖論四:迷宮探索

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic Discuss

Problem Description

有一個地下迷宮,它的通道都是直的,而通道所有交叉點(包括通道的端點)上都有一盞燈和一個開關;請問如何從某個起點開始在迷宮中點亮所有的燈並回到起點?

Input

連續T組數據輸入,每組數據第一行給出三個正整數,分別表示地下迷宮的結點數N(1 < N <= 1000)、邊數M(M <= 3000)和起始結點編號S,隨後M行對應M條邊,每行給出一對正整數,表示一條邊相關聯的兩個頂點的編號。

 

Output

若可以點亮所有結點的燈,則輸出從S開始並以S結束的序列,序列中相鄰的頂點一定有邊,否則只輸出部分點亮的燈的結點序列,最後輸出0,表示此迷宮不是連通圖。
訪問頂點時約定以編號小的結點優先的次序訪問,點亮所有可以點亮的燈後,以原路返回的方式回到起點。

Sample Input

1
6 8 1
1 2
2 3
3 4
4 5
5 6
6 4
3 6
1 5

Sample Output

1 2 3 4 5 6 5 4 3 2 1

深搜即可,回來的路在遞歸回來時輸出

#include <bits/stdc++.h>
using namespace std;


bool visit[100];
int G[100][100];
int cun[100];
int k, sum;


void DFS( int x )
{
    visit[x]   = true;
    cun[sum++] = x;
    for(int i=1; i<=k; i++)
    {
        if(!visit[i] && G[x][i])
        {
            DFS(i);
            cun[sum++] = x;
        }
    }
}

int main()
{
    int t, i;
    cin >> t;
    while ( t-- )
    {
        int n, m, s;
        cin >> n >> m >> s;
        k   = n;
        sum = 0;
        memset( visit, 0, sizeof( visit ) );
        memset( G, 0, sizeof (G));
        memset( cun, 0, sizeof(cun));
        while( m-- )
        {
            int u, v;
            cin >> u >> v;
            G[u][v] = G[v][u] = 1;
        }
        DFS(s);
        if(sum == 2 * n - 1)
        {
            for(i=0; i<sum-1; i++)
                cout << cun[i] << " ";
            cout << cun[i] << endl;
        }
        else
        {
            for(i=0; i<sum; i++)
                cout << cun[i] << " ";
            cout << "0" << endl;
        }
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章