UVa 208 - Firetruck(DFS判连通+回溯)

本文详细介绍了如何使用深度优先搜索(DFS)算法遍历无向图,并输出从特定结点到另一个特定结点的所有路径。通过实例代码展示了实现过程,包括连通性判断和路径查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输入n个结点的无向图和一个结点k,按照字典需输出用结点1到k的所有路径。

首先从k开始dfs将所有与之连通的结点标记,若1位被标记则无解。

然后从结点1开始dfs,只对和k连通的结点进行。找到之后输出。

#include<iostream>
#include<cstring>
using namespace std;
const int maxn=25;
int a[maxn],des,cnt;
bool g[maxn][maxn],vis[maxn];
void dfs(int v){//判断哪些连通。
    vis[v]=true;
    for(int u=1;u<maxn;u++)
        if(g[u][v]&&!vis[u]) dfs(u);
    return;
}
void search(int cur){
    if(a[cur]==des){
        cnt++;
        for(int i=0;i<=cur;i++){
            if(i) cout<<" ";
            cout<<a[i];
        }
        cout<<endl;
        return;
    }
    for(int i=1;i<maxn;i++){
        if(g[a[cur]][i]&&vis[i]){//只对连通的进行dfs。
            a[cur+1]=i;
            vis[i]=false;
            search(cur+1);
            vis[i]=true;
        }
    }
    return;
}
int main(){
    ios::sync_with_stdio(false);
    int t=0;
    while(cin>>des){
        cout<<"CASE "<<++t<<":"<<endl;
        memset(a,0,sizeof(a));
        memset(g,0,sizeof(g));
        memset(vis,0,sizeof(vis));
        int u,v;
        while(cin>>u>>v){
            if(!u&&!v) break;
            g[u][v]=g[v][u]=true;
        }
        cnt=0;
        a[0]=1;
        vis[1]=false;
        dfs(des);
        if(!vis[1]) goto END;//无法到达,输出0。
        search(0);
    END:
        cout<<"There are "<<cnt<<" routes from the firestation to streetcorner "<<des<<"."<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值