PTA 案例6-1.4 地下迷宮探索
阿新 • • 發佈:2021-02-10
題目連結
題目用DFS就能解決,解決步驟如下:
1.先用insert建好鄰接表,在G圖中,元素G[i]代表由與邊i鄰接的點組成的單鏈表,且我們在insert操作中有目的地使鄰接點從連結串列頭至連結串列尾由小到大依次連線,以達成題目中“約定以節點小編號優先的次序訪問”的目的.
2.我們使用STL中的bitset容器,先將test設定為全部訪問過的狀態(即所有代表點i的test[i]都置為1),dfs後再將Vis與test相比較,若相等說明所有點都走過了.
#include<iostream>
#include<cstdio>
#include <algorithm>
#include<cstring>
#include<bitset>
#include<vector>
using namespace std;
const int MAX = 1e3 + 1;
int S;
int N;
int Max;
bitset<MAX>Vis;
bitset<MAX>test;
struct List {
int Data;
List* Next;
};
List G[MAX];
List* insert(int temp, List* head) {
List* tmp = new List[1];
tmp->Data = temp;
tmp->Next = nullptr;
if (head == NULL)
head = tmp;
else {
List* t = head;
List* t1 = head;
while (t->Next != nullptr && temp > t->Data) {
t1 = t;
t = t->Next;
}
if (t->Data > temp) {
if (t == head) {
tmp-> Next = head;
head = tmp;
}
else {
tmp->Next = t1->Next;
t1->Next = tmp;
}
}
else
t->Next = tmp;
}
return head;
}
void dfs(int s) {
bool f1 = false;
for (List* i = G[s].Next; i; i = i->Next) {
int t = i->Data;
if (Vis[t])
continue;
Vis[t] = true;
f1 = true;
printf("%d ", s);
dfs(t);
}
printf("%d", s);
if (Vis != test || S != s)//若回到了起點且所有點都訪問過,則列印的為最後一個點,就不要空格,其它情況都要。
printf(" ");
}
int main() {
int M;
int v, t;
scanf("%d%d%d", &N, &M, &S);
for (int i = 1; i <= N; i++) {
G[i].Data = i;
G[i].Next = nullptr;
test.set(i);
}
for (int i = 0; i < M; i++) {
scanf("%d%d", &v, &t);
G[v].Next = insert(t, G[v].Next);
G[t].Next = insert(v, G[t].Next);
}
Vis[S] = true;
dfs(S);
if (Vis != test)
printf("0");
}