UVA1572 如何判断会重复出现

这题什么都不考

这题考的就是抽象能力,能否从中抽象出一个图论模型来,对思维的要求非常的高

同时也再次使用了dfs判断是否有圈

下面贴出代码:

//这题的关键就是:什么情况就是unbounded
//如果连接过的点,可以再次重复出现,那么就是unbounded

#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
using namespace std;

int vis[52];
int G[52][52];

void draw_eg(char a,char b,char c,char d)
{
    if(a == '0' || c == '0')
        return;
    G[2 * (a - 'A') + !(b == '+' ? 0:1)][2 * (c - 'A') + (d == '+' ? 0:1)] = 1;
}
bool dfs(int x)
{
    vis[x] = -1;
    for(int i = 0;i < 52;i++)
    {
        if(G[x][i])
        {
            if(vis[i] == -1)
                return false;
            if(!vis[i])
                if(!dfs(i))
                  return false;
        }
    }
    vis[x] = 1;
    return true;
}


int main()
{
#ifdef local
    freopen("input.txt","r",stdin);
    freopen("out.txt","w",stdout);
#endif
    int num_squ;
    while(scanf("%d",&num_squ) == 1&& num_squ)
    {
        memset(G,0,sizeof(G));
        memset(vis,0,sizeof(vis));
        char s[10];
        for(int i_0 = 0;i_0 < num_squ;i_0++)
        {
            scanf("%s",s);
            for(int i_1 = 0;i_1 < 4;i_1++)
            {
                for(int i_2 = 0;i_2 < 4;i_2++)
                {
                    if(i_1 != i_2)
                    {
                        draw_eg(s[2 * i_1],s[2 * i_1 + 1],s[2 * i_2],s[2 * i_2 + 1]);
                    }
                }
            }
        }
        //只需要判断是否有圈就可以了
        bool flag = 0;
        for(int j = 0;j < 52;j++)
        {
            if(!vis[j])
                if(!dfs(j))
                {
                    flag = 1;
                    break;
                }
        }
        if(flag)
            printf("unbounded\n");
        else
            printf("bounded\n");

    }
    return 0;
}

 

转载于:https://www.cnblogs.com/TorettoRui/p/10456944.html