uva208 - Firetruck
2013-12-17 20:57
399 查看
dfs+剪枝。
开始没有剪枝,tle了。其实只考虑和目标站在一个连通分量的点就行了。也就是求一个点的连通分量。
开始没有剪枝,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 ; }
相关文章推荐
- UVA - 208 Firetruck(回溯)
- UVa #208 Firetruck (习题7-1)
- UVa 208 - Firetruck 回溯+剪枝 数据
- UVa 208 - Firetruck(DFS判连通+回溯)
- uva 208 Firetruck (需要预先处理 再dfs,TLE是此题AC常规步骤……)
- UVa 208 - Firetruck 回溯+剪枝 数据
- 双向搜索(UVA 208 Firetruck)
- Uva208 Firetruck【dfs】【习题7-1】
- UVa 208 - Firetruck
- UVa 208:Firetruck(DFS)
- UVA 208 Firetruck
- UVA 208 Firetruck
- uva208 - Firetruck
- uva 208 - Firetruck
- Firetruck UVA - 208
- uva 208 Firetruck (回溯)
- UVA 208 Firetruck(DFS)
- UVA - 208 Firetruck(floyd+DFS)
- UVA 208 Firetruck
- UVa 208 - Firetruck