【UVa】208 Firetruck(dfs)
阿新 • • 發佈:2017-12-28
-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)