您的位置:首页 > 其它

uva208 - Firetruck

2013-12-17 20:57 399 查看
dfs+剪枝。

开始没有剪枝,tle了。其实只考虑和目标站在一个连通分量的点就行了。也就是求一个点的连通分量。

#include <iostream>
#include <cstring>
#include<cstdio>
#include<cstdlib>
#include <string>
#include<algorithm>
#include<cmath>
#define set0(a) memset(a, 0, sizeof(a))
#define MARK 2147483647
using namespace std;
int n;
int map[30][30],vis[30];int ans,an[30],ma;int dao[30];
void init(int x)
{
int i;
dao[x]=1;
for(i=1;i<=ma;++i)
{
if(map[x][i]&&!dao[i])
init(i);
}
return;
}
void zhao(int i,int l)
{   int x;
if(i==n)
{   int ii;
ans++;
for(ii=0;ii<l-1;++ii)
printf("%d ",an[ii]);
printf("%d\n",an[ii]);
return;
}
for(x=2;x<=ma;++x)
{
if(!vis[x]&&map[x][i]&&dao[x])
{  an[l]=x;
vis[x]=1;
zhao(x,l+1);
vis[x]=0;
}
}
return ;
}
int main()
{
// freopen("in.txt","r",stdin);
int ci=1;
while(~scanf("%d",&n))
{   set0(map);ma=0;
set0(an);ans=0;
set0(dao);
set0(vis);
int x,y;an[0]=1;
while(1)
{
scanf("%d%d",&x,&y);
if(!x&&!y)break;
if(x>ma)ma=x;
if(y>ma)ma=y;
map[x][y]=1;map[y][x]=1;
}
init(n);             //这个剪枝其实是看别人的,我始终没看明白init(n)和init(1)有什么区别,最后我只能说存在这么一种情况1和n没有通路,减的是这种情况。
printf("CASE %d:\n",ci++);
zhao(1,1);
printf("There are %d routes from the firestation to streetcorner %d.\n",ans,n);
}
return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: