zoukankan      html  css  js  c++  java
  • 重连通量的邻接矩阵和邻接表两种形式的求法

    邻接矩阵:

    #include <cstdio>
    #include <cstring>
    #include <stack>
    using namespace std;
    #define min(a,b) a<b?a:b
    #define N 105
    int dfn[N],low[N],mat[N][N],visit[N],tmpdfn,n;
    struct Edge{
        int x,y;
        void print(){
            printf("%d-%d
    ",x,y);
        }
        bool cmp(Edge &m){
            return (x==m.x&&y==m.y)||(x==m.y&&y==m.x);
        }
    }edge[10005];
    stack<Edge> s;
    void dfs(int u)
    {
        Edge t,tt;
        dfn[u]=low[u]=++tmpdfn,visit[u]=1;
        for(int i=1;i<=n;i++){
            if(mat[u][i]){
                mat[i][u]=0;
                t.x=u,t.y=i;
                s.push(t);
                if(!visit[i]){
                    dfs(i);
                    low[u]=min(low[u],low[i]);
                    if(low[i]>=dfn[u]){
                        //这个while循环没有把最后匹配到的相同边输出,所以最后在pop一次
                        while(!t.cmp(s.top())){
                            tt=s.top();
                            tt.print();
                            s.pop();
                        }
                        tt=s.top();
                        tt.print();
                        s.pop();
                    }
                }
                else low[u]=min(low[u],dfn[i]);
            }
        }
    }
    void init()
    {
        memset(dfn,0,sizeof(dfn));
        memset(low,0,sizeof(low));
        memset(visit,0,sizeof(visit));
        tmpdfn=0;
    }
    int main()
    {
        int a,b,k;
        scanf("%d",&k);
        n=0;
        for(int i=1;i<=k;i++){
            scanf("%d%d",&a,&b);
            mat[a][b]=1,mat[b][a]=1;
            if(a>n) n=a;
            if(b>n) n=b;
        }
        init();
        for(int i=1;i<=n;i++)
            if(!visit[i]) dfs(i);
        return 0;
    }

    邻接表:

    #include <cstdio>
    #include <cstring>
    #include <stack>
    #include <iostream>
    using namespace std;
    #define N 105
    #define min(a,b) a<b?a:b
    int visit[N],dfn[N],low[N],first[N],tmpdfn,k,n;
    
    struct Edge{
        int x, y;
        void print(){
            printf("%d-%d
    ",x,y);
        }
        bool cmp(Edge &m){
            return (m.x==x&&m.y==y)||(m.y==x&&m.x==y);
        }
    };
    stack<Edge> s;
    struct Path{
        int y,next,vis;
    }path[10005];
    void add(int x,int y)
    {
        path[k].y=y,path[k].next=first[x];
        first[x]=k;
        k++;
    }
    void init()
    {
        memset(visit,0,sizeof(visit));
        memset(dfn,0,sizeof(dfn));
        memset(low,0,sizeof(low));
        memset(first,-1,sizeof(first));
        k=0,tmpdfn=0;
    }
    void dfs(int u)
    {
        Edge t,tt;
        dfn[u]=low[u]=++tmpdfn,visit[u]=1;
        for(int i=first[u];i!=-1;i=path[i].next){
            if(!path[i].vis){
                t.x=u,t.y=path[i].y;
                s.push(t);
                path[i].vis=1,path[i^1].vis=1;
                if(!visit[path[i].y]){
                    dfs(path[i].y);
                    low[u]=min(low[u],low[path[i].y]);
                    if(low[path[i].y]>=dfn[u]){
                        while(!t.cmp(s.top())){
                            tt=s.top();
                            tt.print();
                            s.pop();
                        }
                        tt=s.top();
                        tt.print();
                        s.pop();
                    }
                }
                else low[path[i].y]=min(dfn[u],low[path[i].y]);
            }
        }
    }
    int main()
    {
        int a,b,m;
        scanf("%d%d",&n,&m);
        init();
        for(int i=1;i<=m;i++){
            scanf("%d%d",&a,&b);
            add(a,b);
            add(b,a);
        }
    
        for(int i=1;i<=n;i++)
            if(!visit[i]) dfs(i);
        return 0;
    }
  • 相关阅读:
    log4j 使用笔记整理中
    执行bat文件
    excel让每个单元格的宽度随着字体自动变动的两种方式(有更好方法的大神,请忽略,求评论下)
    XML中CDATA及其字符实体的使用
    Java文件读写操作指定编码方式。。。。。
    尾数为0零BigDecimal不能装成正常数
    jquery 自动补全控件(支持IE6)待整理
    $.ajax提交,后台接受到的值总是乱码?明天再总结
    js定义变量需赋予初始值
    存储过程的优缺点
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/3888316.html
Copyright © 2011-2022 走看看