• UVA-1572 Self-Assembly (图+拓扑排序)


    题目大意:每条边上都有标号的正方形,两个正方形能通过相匹配的边连接起来,每种正方形都有无限多个。问能否无限延展下去。

    题目分析:将边视为点,正方形视为边,建立无向图,利用拓扑排序判断是图否为DAG。

    代码如下:

    # include<iostream>
    # include<cstdio>
    # include<map>
    # include<queue>
    # include<string>
    # include<vector>
    # include<cstring>
    # include<algorithm>
    using namespace std;
    
    int vis[55],mp[55][55];
    
    int get(char a,char b)
    {
        return (a-'A')*2+((b=='+')?1:0);///因为在这没注意运算符的优先级,一直WA。。。。。。
    }
    
    void f(char *p)
    {
        for(int i=0;i<8;i+=2){
            if(p[i]=='0')  continue;
            for(int j=0;j<8;j+=2){
                if(i==j||p[j]=='0')  continue;
                int a=get(p[i],p[i+1])^1;
                int b=get(p[j],p[j+1]);
                mp[a][b]=1;
            }
        }
    }
    
    bool dfs(int u)
    {
        vis[u]=-1;
        for(int i=0;i<52;++i){
            if(!mp[u][i])
                continue;
            if(vis[i]==-1)
                return true;
            if(!vis[i]&&dfs(i))
                return true;
        }
        vis[u]=1;
        return false;
    }
    
    bool judge()
    {
        memset(vis,0,sizeof(vis));
        for(int i=0;i<52;++i)
            if(!vis[i]&&dfs(i))
                return true;
        return false;
    }
    
    int main()
    {
        int n;
        char p[9];
        while(scanf("%d",&n)==1)
        {
            memset(mp,0,sizeof(mp));
            while(n--)
            {
                scanf("%s",p);
                f(p);
            }
            if(judge())
                printf("unbounded
    ");
            else
                printf("bounded
    ");
        }
        return 0;
    }
    

      

  • 相关阅读:
    数据结构入门
    C语言入门-全局变量
    C语言入门-类型定义
    C++ 名称空间嵌套
    C++ 名称空间
    C++ 一些术语
    C++ new初始化与定位new运算符
    网络时间自动同步工具
    C++ 语言链接性
    C++ 函数和链接性
  • 原文地址:https://www.cnblogs.com/20143605--pcx/p/4865237.html
Copyright © 2020-2023  润新知