UVA 208 Firetruck

来源:互联网 发布:淘宝充流量怎么退款 编辑:程序博客网 时间:2024/05/09 21:37


用dfs搜索所有路径即可,注意一点的是如果1到N是不连通的,我们就没有必要枚举所有路径了。


#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <string>#include <vector>#include <queue>#include <algorithm>using namespace std;const int maxn = 1010;struct Edge {    int v, next;    Edge() {}    Edge(int t_v, int t_next) : v(t_v), next(t_next) {}}edges[2*maxn];int head[maxn], edge_sum;void add_edge(int u, int v) {    edges[edge_sum].v = v;    edges[edge_sum].next = head[u];    head[u] = edge_sum++;    edges[edge_sum].v = u;    edges[edge_sum].next = head[v];    head[v] = edge_sum++;}int N;int cnt;int path[maxn];bool visit[maxn];vector<int> vec[maxn];void init_graph() {    for(int i = 0; i < maxn; ++i) {        vec[i].clear();    }    //edge_sum = 0;    //memset(head, -1, sizeof(head));}bool dfs1(int u) {    visit[u] = true;    if(u == N) {        return true;    }    int len = vec[u].size();    for(int i = 0; i < len; ++i) {        int v = vec[u][i];        if(visit[v]) continue;        if(dfs1(v)) return true;    }    return false;}void dfs2(int u, int pos) {    path[pos] = u;    if(u == N) {        cnt++;        for(int i = 0; i <= pos; ++i) {            if(i == 0) {                printf("%d", path[i]);            } else {                printf(" %d", path[i]);            }        }        printf("\n");        return ;    }    int len = vec[u].size();    for(int i = 0; i < len; ++i) {        int v = vec[u][i];        if(visit[v]) continue;        visit[v] = true;        dfs2(v, pos + 1);        visit[v] = false;    }    return ;}int main() {    //freopen("aa.in", "r", stdin);    int u, v;    int kcase = 0;    while(scanf("%d", &N) != EOF) {        kcase++;        init_graph();        while(scanf("%d %d", &u, &v) != EOF) {            if(u == 0 && v == 0) break;            vec[u].push_back(v);            vec[v].push_back(u);            //add_edge(u, v);        }        for(int i = 1; i < maxn; ++i) {            sort(vec[i].begin(), vec[i].end());        }        cnt = 0;        printf("CASE %d:\n", kcase);        memset(visit, false, sizeof(visit));        if(!dfs1(1)) {            printf("There are %d routes from the firestation to streetcorner %d.\n", 0, N);        } else {            memset(visit, false, sizeof(visit));            visit[1] = true;            dfs2(1, 0);            printf("There are %d routes from the firestation to streetcorner %d.\n", cnt, N);        }    }    return 0;}



0 0
原创粉丝点击