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

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

Time Limit: 1000MS Memory limit: 65536K

題目描述

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

輸入

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

 

輸出

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

示例輸入

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

示例輸出

1 2 3 4 5 6 5 4 3 2 1

提示

 這個題的意思不好理解,其實理解了就不難了,由一點先遍歷到底一個一個輸出,然後再返回,返回的點在一個一個按順序輸出,並不是先遍歷完,再倒着輸出

來源

xam 

示例程序

 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int p[1001][1001],vis[1001],q[1001];
int rear,front,n;
void DFS(int e)
{
    q[rear++]=e;
    int i;
    vis[e]=1;
    for(i=1; i<=n; i++)
    {
        if(p[e][i]==1&&!vis[i])
        {
            DFS(i);
            q[rear++]=e;
        }
    }
}
int main()
{
    int s,m,a,b,t,i;
    scanf("%d",&t);
    while(t--)
    {
        memset(p,0,sizeof(p));
        memset(vis,0,sizeof(vis));
        scanf("%d%d%d",&n,&m,&s);
        while(m--)
        {
            scanf("%d%d",&a,&b);
            p[a][b]=1;
            p[b][a]=1;
        }
        rear=0;
        DFS(s);
        for(i=0; i<rear; i++)
        {
            if(!i)
                printf("%d",q[i]);
            else
                printf(" %d",q[i]);
        }
        if(rear!=2*n-1)
            printf(" 0");
        printf("\n");
    }
    return 0;
}


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