您的位置:首页 > 其它

UVA 208 Firetruck

2016-03-31 21:59 330 查看
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19858

题意:给一个无向图,起点为1,终点为k,按照字典序输出所有可行路径。



思路:可以先用floyd判断一下图的连通性,对于那些不能到达目标的点,我们一开始就排除掉,然后就用dfs+回溯搜索一下即可。



#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <utility>
using namespace std;

#define rep(i,j,k) for (int i=j;i<=k;i++)
#define Rrep(i,j,k) for (int i=j;i>=k;i--)

#define Clean(x,y) memset(x,y,sizeof(x))
#define LL long long
#define ULL unsigned long long
#define inf 0x7fffffff
#define mod %100000007

#define mp make_pair
#define fi first
#define se second

#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mid int m=(l+r)>>1

bool b[30][30];

int aim;
int T = 0;
int a[30][30];
bool flag[30];
int tx,ty;
int ans;
int m;
int out[30];
void dfs(int x,int k)
{
if ( x == aim )
{
ans++;
rep(i,1,k) printf("%d%c",out[i],(i==k)?'\n':' ');
return;
}
rep(i,1,m)
if ( flag[i] && a[x][i] )
{
flag[i] = false;
out[k+1] = i;
dfs(i,k+1);
flag[i] = true;
}
}

int main()
{
while(cin>>aim)
{
//if ( T++ ) puts("");
printf("CASE %d:\n",++T);
m = 1;
Clean(a,false);
Clean(b,false);
Clean(flag,true);
ans = 0;
while(~scanf("%d%d",&tx,&ty))
{
m = max( m , max(tx,ty) );
if ( tx + ty == 0 ) break;
a[tx][ty] = true;
a[ty][tx] = true;

b[ty][tx] = true;
b[tx][ty] = true;
}

rep(i,1,m)
rep(j,1,m)
rep(k,1,m)
if ( b[i][k] && b[k][j] ) b[i][j] = true;

rep(i,1,m) if ( !b[i][aim] && i!=aim ) flag[i] = false;
flag[1] = false;
out[1] = 1;
dfs(1,1);
printf("There are %d routes from the firestation to streetcorner %d.\n",ans,aim);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: