1. 程式人生 > >【UVa】208 Firetruck(dfs)

【UVa】208 Firetruck(dfs)

-m main truck 開始 clear %d span 需要 from

題目

題目
?


?

分析

一開始不信lrj的話,沒判聯通,果然T了。
沒必要全部跑一遍判,只需要判斷一下有沒有點與n聯通,鄰接表不太好判,但無向圖可以轉換成去判n與什麽聯通。
關於為什麽要判,還是因為數據造的強,造了許多之前的節點情況巨多,然而所有節點都不和中點連接的情況。。。。。。
?


?

代碼

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

int n;
vector<int> G[100];
vector<int> Ans;

int num=0;
bool vis[100];

bool dfs(int u)
{
    if
(u==n) { printf("%d",Ans[0]); for(int i=1;i<Ans.size();i++) printf(" %d",Ans[i]); puts(""); num++; return true; } for(int i=0;i<G[u].size();i++) { int v=G[u][i]; if(vis[v]) continue; Ans.push_back(v); vis[v]=true
; if(dfs(v)) Ans.pop_back(); vis[v]=false; } return true; } int main() { int t=0; while(scanf("%d",&n)==1 && n) { memset(vis,0,sizeof(vis)); for(int i=0;i<30;i++) G[i].clear(); Ans.clear(); num=0; printf("CASE
%d:\n",++t); int a,b; while(scanf("%d%d",&a,&b) && a && b) { if(a==b) continue; G[b].push_back(a); G[a].push_back(b); } int ok=0; for(int i=0;i<G[n].size();i++) if(G[n][i]) ok=1; G[0].push_back(1); for(int i=1;i<=n;i++) sort(G[i].begin(),G[i].end()); if(ok) dfs(0); printf("There are %d routes from the firestation to streetcorner %d.\n",num,n); } return 0; }

【UVa】208 Firetruck(dfs)