美文网首页
简单图论题目

简单图论题目

作者: _弓长_大人 | 来源:发表于2018-09-25 12:43 被阅读26次

运用 反向建图 dfs 查找路径,回溯路径

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
#define MAX 1<<17
bool vis[MAX];
struct Node{
int v,u,id;
};
Node node[MAX];
int head[MAX];
int cnt=0;
int k;
int top=0;
void init()
{
    memset(vis,0,sizeof(vis));
    memset(head,-1,sizeof(head));
    cnt=0;
    top=0;
}
void add_e(int u,int v,int id)
{
    node[cnt].v=v;
    node[cnt].u=head[u];
    node[cnt].id=id;
    head[u]=cnt++;
}
int str[MAX];
void dfs(int u)
{
    for(int i=head[u];i!=-1;i=node[i].u)
    {
        if(!vis[node[i].id])
        {
            vis[node[i].id]=1;
            int temp=node[i].id&1;
            dfs(node[i].v);
            str[top++]=node[i].id;
        }
    }
}
int main()
{
    while(~scanf("%d",&k))
    {
        init();
        int ans=1<<k;
        printf("%d ",ans);
        int len=1<<(k-1);
        for(int i=0;i<len;i++)
        {
            int id=i<<1|1,v=id%len;
            add_e(i,v,id);
            id=i<<1,v=id%len;
            add_e(i,v,id);
        }
        dfs(0);
        for(int i=top-1;i>=0;i--)
        {
            printf("%d",str[i]/len);
        }
         printf("\n");
    }
    return 0;
}

DFS遍历 每一条边

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
using namespace std;
#define maxn 200005
struct Node{
int next;
int v;
int id;
};
Node node[maxn];
int head[maxn];
bool vis[maxn];
int cnt=0;
void init()
{
    memset(head,-1,sizeof(head));
    memset(vis,0,sizeof(vis));
    cnt=0;
}
void add_e(int u,int v)
{
    node[cnt].v=v;
    node[cnt].id=cnt;
    node[cnt].next=head[u];
    head[u]=cnt++;
}
int flag=0;
void dfs(int u)
{
    for(int i=head[u];i!=-1;i=node[i].next)
    {
        if(vis[i]==0)//这一条边 没被访问过
        {
            vis[i]=1;
            dfs(node[i].v);
            flag=1;
        }
    }
}
int main() {
    int n, m, p;
    while(~scanf("%d%d", &n, &m))
        {
            int a,b;
            init();
            for(int i=0;i<m;i++)
            {
                scanf("%d%d", &a, &b);
                add_e(a,b);
            }
            int ans=0;
        for(int i=1;i<=n;i++)
        {
            flag=0;
            dfs(i);
            if(flag)
            {
                ans++;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

相关文章

  • 简单图论题目

    运用 反向建图 dfs 查找路径,回溯路径 DFS遍历 每一条边

  • <<数学之美>> part5

    摘要: [图论] [网络爬虫] [图的遍历] 图论 说到图论,必须要提的就是KonigsBerg七桥问题,简单说就...

  • 刷题计划

    并查集 题目 图论 题目 树 题目 资源参考 倍增LCA LCA和RMQ Tarjan LCA 倍增 题目 DP 题目

  • 简单图论算法笔记

    深度优先搜索 在图中搜索的一般过程为: 记录当前结点被发现的时间(discovery time) 遍历访问未被访问...

  • 五一的成果

    emm。。 五一过了有意义的四天。 原来简单的图论我也是可以搞出来的 原来DFS放进图论真的会使难度变大 原来BF...

  • 图神经网络03-图与图学习(中)

    在上篇中,我们简单学习了图论的基本概念,图的表示和存储方式,同构图和异构图的分类,以及几个基础的图论算法。在接下来...

  • 茅佳源的图论

    T1084 茅佳源的图论 进入题目(只有山东省北镇中学团队成员可以查看)提交该题记录列表 Ps.题目由钟皓曦提供...

  • 《宇宙猜想》目录

    廿八学会 - 《宇宙图论》只是想将一切看得更清晰些(微信公众号:宇宙猜想) 《宇宙图论》目录 大目录 一、宇宙图论...

  • lintcode 简单题目

    前言:好久没上lintcode了,今天一登,发现有好多新题。先刷几十道玩玩。 Palindrome Permuta...

  • CodeCraft背后的故事:程序究竟有多快?

    华为第二届校园软件大赛的题目,是图论中的寻路算法题。题目要求在一个有向图中,找出经过特定节点集合并且权重最小的路径...

网友评论

      本文标题:简单图论题目

      本文链接:https://www.haomeiwen.com/subject/kogbrxtx.html