• hdu4324(拓扑排序&强连通)


    结论题:竞赛图中有环,则必存在三元环。

    拓扑排序判环,没什么好说的了。

    附代码:

    View Code
    #include <iostream>
    #include <string.h>
    #include <stdio.h>
    using namespace std;
    #define E 2002
    char a[E][E];
    int map[E][E];
    int count[E];
    bool Topsort(int n,int edge[][E])
    {
        int i,top=-1;
        for(i=0;i<n;i++)
            if(count[i]==0)
            {
                count[i]=top;
                top=i;
            }
        for(i=0;i<n;i++)
            if(top==-1)
            {
                return 1;
            }
            else
            {
                int j=top;
                top = count[j];
                //printf("%d->",j);
                for(int k=0;k<n;k++)
                    if(edge[j][k])
                    {
                        count[k]--;
                        if(count[k]==0)
                        {
                            count[k]=top;
                            top=k;
                        }
                    }
            }
            return 0;
    }
    int main()
    {
        int ncas,n,t=0;
        scanf("%d",&ncas);
        while(ncas--){
            scanf("%d",&n);
            for(int i=0;i<n;i++)
                scanf("%s",a[i]);
            memset(count,0,sizeof(count));
            for(int i=0;i<n;i++)
                for(int j=0;j<n;j++){
                    map[i][j]=a[i][j]-'0';
                    if(map[i][j]) count[j]++;
                }
            bool flag=Topsort(n,map);
            printf("Case #%d: ",++t);
            if(flag) printf("Yes\n");
            else printf("No\n");
        }
        return 0;
    }

    结论题:竞赛图中如果存在点数>=3的强连通子图,则必存在点数==3的强连通子图。

    附代码:

    View Code
    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    #define V 2002
    #define E V*V
    using namespace std;
    void tarjan(int u);
    void solve();
    void suodian();
    void addedge(int u,int v,int c);
    int top,cnt,index,n,ecnt;
    bool instack[V],flag;
    int stack[V],id[V],dfn[V],low[V],num[V],in[V];
    int head[V];
    struct edge
    {
        int s;
        int t;
        int cost;
        int next;
    }e[E];
    char a[V][V];
    int map[V][V];
    void suodian()
    {
        flag=0;
        for(int i=1;i<=cnt;i++){
            if(num[i]>=3){
                flag=1;
                return ;
            }
        }
    }
    
    void solve()
    {
    
        top=cnt=index=0;
        memset(dfn,0,sizeof(dfn));
        memset(num,0,sizeof(dfn));
        for(int i=1;i<=n;i++)
        {
            if(!dfn[i])
                tarjan(i);
    
        }
        suodian();
    }
    
    void tarjan(int u)
    {
        int v;
        int tmp;
        dfn[u]=low[u]=++index;
        instack[u]=true;
        stack[++top]=u;
        for(int k=head[u];k!=-1;k=e[k].next)
        {
            v=e[k].t;
            if(!dfn[v])
            {
                tarjan(v);
                if(low[v]<low[u])
                    low[u]=low[v];
            }
            else if(instack[v] && dfn[v]<low[u])
            {
                low[u]=dfn[v];
            }
        }
        if(dfn[u]==low[u])
        {
            cnt++;
            do
            {
                tmp=stack[top--];
                instack[tmp]=false;
                id[tmp]=cnt;
                num[cnt]++;//统计标号为cnt的强连通分量中点的个数
            }
            while(tmp!=u);
    
        }
    }
    
    void addedge(int u,int v)
    {
        e[ecnt].s=u;
        e[ecnt].t=v;
        e[ecnt].next=head[u];
        head[u]=ecnt++;
    }
    
    int main()
    {
        int ncas,t=0;
        scanf("%d",&ncas);
        while(ncas--){
            scanf("%d",&n);
            for(int i=0;i<n;i++)
                scanf("%s",a[i]);
            ecnt=0;
            memset(head,-1,sizeof(head));
            for(int i=0;i<n;i++)
                for(int j=0;j<n;j++)
                    if(a[i][j]-'0')
                        addedge(i+1,j+1);
            solve();
            printf("Case #%d: ",++t);
            if(flag) printf("Yes\n");
            else printf("No\n");
        }
        return 0;
    }
  • 相关阅读:
    关于feign调用请求头丢失分析
    并发下编写SQL的注意事项
    Sentinel降级规则整理
    Mybatis-Plus使用整理
    Docker各种零散命令整理
    set集合怎么保证不重复的
    idea启动项目ava heap space
    网络穿透工具--钉钉HTTP穿透
    Log4j基本使用
    ide中普通java程序打包
  • 原文地址:https://www.cnblogs.com/markliu/p/2618833.html
Copyright © 2020-2023  润新知