【UVa】208 Firetruck(dfs)

题目

题目
?



?

分析

一开始不信lrj的话,没判联通,果然T了。
没必要全部跑一遍判,只需要判断一下有没有点与n联通,邻接表不太好判,但无向图可以转换成去判n与什么联通。
关于为什么要判,还是因为数据造的强,造了许多之前的节点情况巨多,然而所有节点都不和中点连接的情况。。。。。。
?



?

代码

#include <bits/stdc++.h>
using namespace std;

int n;
vector<int> G[100];
vector<int> Ans;

int num=0;
bool vis[100];

bool dfs(int u)
{
    if(u==n)
    {
        printf("%d",Ans[0]);
        for(int i=1;i<Ans.size();i++) printf(" %d",Ans[i]);
        puts("");
        num++;
        return true;
    }
    for(int i=0;i<G[u].size();i++)
    {
        int v=G[u][i];
        if(vis[v]) continue;
        Ans.push_back(v);
        vis[v]=true;
        if(dfs(v)) Ans.pop_back();
        vis[v]=false;
    }
    return true;
}

int main()
{
    int t=0;
    while(scanf("%d",&n)==1 && n)
    {
        memset(vis,0,sizeof(vis));
        for(int i=0;i<30;i++) G[i].clear();
        Ans.clear();
        num=0;

        printf("CASE %d:\n",++t);
        int a,b;
        while(scanf("%d%d",&a,&b) && a && b)
        {
            if(a==b) continue;
            G[b].push_back(a);
            G[a].push_back(b);
        }

        int ok=0;
        for(int i=0;i<G[n].size();i++)
            if(G[n][i]) ok=1;
        G[0].push_back(1);
        for(int i=1;i<=n;i++) sort(G[i].begin(),G[i].end());

        if(ok) dfs(0);
        printf("There are %d routes from the firestation to streetcorner %d.\n",num,n);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/noblex/p/8137435.html

时间: 2024-11-05 19:44:49

【UVa】208 Firetruck(dfs)的相关文章

【UVA】821-Page Hopping(Floyd)

模板题,求一个点到任何一点的距离,用Floyd就行了,结点不一定是从1 ~ n 的,所以需要记录结点的id 14063895 821 Page Hopping Accepted C++ 0.119 2014-08-19 10:00:27 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<sta

【UVA】10318-Security Panel(DFS 回溯)

比较纠结的一道题,改了好几次才对. 首先需要知道的就是每个点如果重复点2次是没有任何意义的,所以一个点只有选或者不选,那么时间复杂度最大为2^25 毫无疑问超过了允许的范围,那么考虑减枝. 由于是3 X 3 的改变范围,所以如果 当前走到了第三行,那么就没办法更改第一行的状态,如果走到了第四行就无法更改第一 二行的状态,所以如果这个时候第一 二行 还没改成亮的它永远也不可能亮了. 最后一个就是需要输出按开关的次数最小的方案,一开始没看见,WA了好几次.. 14171735 10318 Secur

【UVa】Biggest Number(dfs+剪枝)

题目 题目 ? ? 分析 典型搜索,考虑剪枝. 统计一下联通分量. 1.本位置能够达到所有的点的数量加上本已有的点,还没有之前的结果长,直接返回. 2.当本位置能够达到所有的点的数量加上本已有的点与之前的结果一样长,就把联通分量里的点从大到小排序.如果这样都比Ans小,那么直接返回. 前两种是大多人用的,这两个剪枝有了,AC不是问题. 3.如果本图没有障碍物,那么意味着所有点联通,那么结果必定是从整张图的最大值出发的,非最大值,就不用考虑了. 这个是我自己想的,大约能剪 40-80 ms. 个人

【搜索】棋盘问题(DFS)

Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. Input 输入含有多组测试数据. 每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目. n <= 8 , k <= n 当为-1 -1时表示输入结束. 随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示

【ZOJ1003】Crashing Balloon(DFS)

Crashing Balloon Time Limit: 2 Seconds      Memory Limit: 65536 KB On every June 1st, the Children's Day, there will be a game named "crashing balloon" on TV.   The rule is very simple.  On the ground there are 100 labeled balloons, with the num

【UVa】Wavio Sequence(dp)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1475 正反一次lis然后去min{左,右}*2-1即可 #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream&

【UVA】1346 - Songs(贪心)

根据题意可以得到,长度小,并且频率低的排到前面,所以设 k = l  / q; 之后sort排序就可以 14128675 1346 Songs Accepted C++ 0.029 2014-09-01 11:30:14 #include <iostream> #include <cstdlib> #include <cstdio> #include <string> #include <cstring> #include <cmath&g

【UVA】201 Squares(模拟)

题目 题目 ? ? 分析 记录一下再预处理一下. ? ? 代码 #include <bits/stdc++.h> int main() { int t=0,s,n; while(scanf("%d",&s)==1) { if(t!=0) printf("\n**********************************\n\n"); int ans[11],H[21][21],V[21][21]; memset(V,0,sizeof(V))

【UVA】12169-Disgruntled Judge(暴力or欧几里得)

可能由于后台数据的原因,这道题直接暴力枚举a,b进行判断也能过,不过跑的时间长,效率太差了. 14021006 12169 Disgruntled Judge Accepted C++ 0.876 2014-08-11 08:46:28 不说了,比较无脑. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #incl