您的位置:首页 > 其它

UVA 208 Firetruck

2015-10-07 15:36 369 查看
题意:给出一个图  求从点1到点n的方案数(每个点只能走一次)

暴力dfs会T 可以加一个剪枝 如果当前dfs跑的点与n不连通 就可以不再跑了 所以用bfs 或并查集 把和n连通的点都标记上即可

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cctype>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<hash_map>
#include<algorithm>
#include<set>
#define scnaf scanf
#define cahr char
#define bug puts("bugbugbug");
using namespace std;
typedef long long ll;
const int mod=10007;
const int maxn=1e4+50;
const int maxx=1e4;
const int inf=1e9;
bool visit[35];
bool use[35];
int lujing[35];
int f[35];
vector<int >vec[35];
int F(int x)
{
return f[x]=(f[x]==x?x:F(f[x]));
}
int n,test=1,ans;
void dfs(int id,int cnt)//位置 深度
{
lujing[cnt]=id;
if(id==n)
{
ans++;
for(int i=1;i<=cnt;i++)
printf("%d%c",lujing[i],i!=cnt?' ':'\n');
return;
}
visit[id]=1;
for(int i=0;i<vec[id].size();i++)
{
int next=vec[id][i];
if(visit[next]==0&&use[next]) dfs(next,cnt+1);
}
visit[id]=0;
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=1;i<=25;i++)
{
vec[i].clear();
f[i]=i;
use[i]=0;
visit[i]=0;
}
int a,b;
ans=0;
while(~scanf("%d%d",&a,&b)&&a+b)
{
vec[a].push_back(b);
vec[b].push_back(a);
f[F(a)]=F(b);
}
for(int i=1;i<=25;i++){
sort(vec[i].begin(),vec[i].end());
if(F(i)==F(n)) use[i]=1;
}
printf("CASE %d:\n",test++);
dfs(1,1);
printf("There are %d routes from the firestation to streetcorner %d.\n",ans,n);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dfs