C++ DFS

#include <iostream>
#include "malloc.h"
#include "stdlib.h"

using namespace std;
typedef bool* pbool;
template<class T>
class Graph
{
    public:
        Graph(int vertexNum,int adjNum);
        virtual ~Graph();
        T* vertex;
        bool** adjArr;
        int vertexNum;
        int adjNum;
        void DFSTravse();
        void DFS(int i,bool *flag);
        //void BFSTravse();
        //void BFS();
    protected:
    private:
};

template<class T>
Graph<T>::Graph(int vertexNum,int adjNum):vertexNum(vertexNum),adjNum(adjNum)
{
    vertex = new T[vertexNum];

    adjArr = new pbool[vertexNum];

    for(int i=0;i<vertexNum;i++)
    {
        adjArr[i] = new bool[vertexNum];
    }
}

template<class T>
Graph<T>::~Graph()
{
    delete [] vertex;
    for(int i=0;i<vertexNum;i++)
    {
        delete[] adjArr[i];
    }
    delete[] adjArr;
}

template<class T>
void Graph<T>::DFSTravse()
{
    bool* flag = new bool[vertexNum];

    //initialize flag
    for(int i=0;i<vertexNum;i++)
    {
        flag[i] = false;
    }

    for(int i=0;i<vertexNum;i++)
    {
        if(!flag[i])
        {
            this->DFS(i,flag);
        }
    }

    delete[] flag;
}

template<class T>
void Graph<T>::DFS(int i,bool* flag)
{
    cout<<vertex[i]<<endl;
    flag[i] = true;

    for(int j=0;j<vertexNum;j++)
    {
        if(adjArr[i][j]&&!flag[j])
        {
            DFS(j,flag);
        }
    }
}

int main()
{
    int vertexNum,adjNum;

    cout<<"input vertextNum and adjNum"<<endl;

    cin>>vertexNum>>adjNum;

    Graph<char> * graph = new Graph<char>(vertexNum,adjNum);

    for(int i=0;i<vertexNum;i++)
    {
        cin>>graph->vertex[i];
    }
    system("pause");
    for(int i=0;i<adjNum;i++)
    {
        int x,y;
        cin>>x>>y;
        cin>>graph->adjArr[x][y];
        graph->adjArr[y][x] = graph->adjArr[x][y];
    }

    system("pause");

    graph->DFSTravse();

    system("pause");

    return 0;
}
时间: 2024-10-17 22:25:20

C++ DFS的相关文章

解救小哈——DFS算法举例

一.问题引入 有一天,小哈一个人去玩迷宫.但是方向感不好的小哈很快就迷路了.小哼得知后便去解救无助的小哈.此时的小哼已经弄清楚了迷宫的地图,现在小哼要以最快的速度去解救小哈.那么,问题来了... 二.问题的分析 首先我们用一个二维数组来存储这个迷宫,刚开始的时候,小哼处于迷宫的入口处(1,1),小哈在(p,q).其实这道题的的本质就在于找从(1,1)到(p,q)的最短路径. 此时摆在小哼面前的路有两条,我们可以先让小哼往右边走,直到走不通的时候再回到这里,再去尝试另外一个方向. 在这里我们规定一

【BZOJ4942】[Noi2017]整数 线段树+DFS(卡过)

[BZOJ4942][Noi2017]整数 题目描述去uoj 题解:如果只有加法,那么直接暴力即可...(因为1的数量最多nlogn个) 先考虑加法,比较显然的做法就是将A二进制分解成log位,然后依次更新这log位,如果最高位依然有进位,那么找到最高位后面的第一个0,将中间的所有1变成0,那个0变成1.这个显然要用到线段树,但是复杂度是nlog2n的,肯定过不去. 于是我在考场上yy了一下,这log位是连续的,我们每次都要花费log的时间去修改一个岂不是很浪费?我们可以先在线段树上找到这段区间

uva1103(dfs)

UVA - 1103 还是没写好,,看的别人的 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <algorithm> 6 #include <cstdlib> 7 #include <stack> 8 #include <cctype> 9 #include <str

poj 1088 滑雪 DP(dfs的记忆化搜索)

题目地址:http://poj.org/problem?id=1088 题目大意:给你一个m*n的矩阵 如果其中一个点高于另一个点 那么就可以从高点向下滑 直到没有可以下滑的时候 就得到一条下滑路径 求最大的下滑路径 分析:因为只能从高峰滑到低峰,无后效性,所以每个点都可以找到自己的最长下滑距离(只与自己高度有关).记忆每个点的最长下滑距离,当有另一个点的下滑路径遇到这个点的时候,直接加上这个点的最长下滑距离. dp递推式是,dp[x][y] = max(dp[x][y],dp[x+1][y]+

蓝桥杯 大臣的旅费_树的最长度_两次DFS

#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cstring> #include <functional> #include <vector> using namespace std; const int maxn = 1000000 + 10; const int INF = 10000000

A. The Fault in Our Cubes 暴力dfs

http://codeforces.com/gym/101257/problem/A 把它固定在(0,0, 0)到(2, 2, 2)上,每次都暴力dfs检查,不会超时的,因为规定在这个空间上,一不行,就会早早退出. 这样写起来比较好写. #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #include <

codeforces717E Paint it really, really dark gray(树上dfs)

题意: 给你一棵树,2e5个节点,每个节点有一种颜色(黑色或粉色) 让你从节点1开始,自由沿边行走,到达节点时会把这个节点的颜色改变 要求你输出任意一条路径使得从节点1出发,所有节点的颜色都变为黑色 思路: 很明显要递归遍历 每到达一个节点就先改变节点的颜色标志并输出当前节点 如果当前到达了叶子节点,则不用进行操作 返回上层节点时再改变节点的颜色标志并输出当前节点,然后判断叶子节点的颜色,如果为粉色,则再到达一次叶子节点再回到当前节点 这样确保当前节点的所有儿子节点都为黑色的 然后就这样一直递归

POJ2488 dfs

A Knight's Journey Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 41972   Accepted: 14286 Description Background The knight is getting bored of seeing the same black and white squares again and again and has decided to make a journey ar

BZOJ_1016_[JSOI2008]_最小生成树计数_(dfs+乘法原理)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1016 给出一张图,其中具有相同权值的边的数目不超过10,求最小生成树的个数. 分析 生成树的计数有一个什么什么算法... 我真的企图研究了...但是智商捉急的我实在看不懂论文... 所以最后还是写了暴力... 当然暴力也要靠正确的姿势的. 首先来看一个结论: 同一张图的所有最小生成树中,边权值相同的边的数目是一定的. 也就是说,假如某一张图的某一棵最小生成树由边权值为1,1,2,2,2,3的

邻接表实现Dijkstra算法以及DFS与BFS算法

//============================================================================ // Name : ListDijkstra.cpp // Author : fffff // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //==========================