UVa 1572 Self-Assembly (构造+拓扑排序。。。。。)

题意:给定n个带标号的正方形,标号要么是一个大写字母加一个+或-,要么是00,

当且仅当大写字母相同并且符号相反时可以连接,问你给定的能不能拼成一个无限大的的东西。

析:说实话,真心没有看出来是拓扑排序,后来知道是,可是还是不会写。

既然要拼成无限大,那么只要拼的时候拼出一个环来,又由于每个是无限多的,那么可以一直重复,

就能拼起来无限大的东西,把每个正方形看成一条边,那么不就是一个拓扑排序,看看能不能找到一个环么,

如果能找到,那么就可以,找不到,就不可以。注意的是正方形可以从四面都拼,所以要注意考虑全了,

刚开始,忘了,只考虑了两端,WA。把每个边都标记一下就好,相当于构造出一个图来。

代码如下:

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;
const int maxn = 55;
int G[maxn][maxn], c[maxn];
char s[10];

int getid(char a, char b) {  return (a - ‘A‘)* 2 + (‘+‘ == b ? 1 : 0);  }

void solve(char a1, char a2, char b1, char b2){
    if(‘0‘ == a1 || ‘0‘ == b1)  return ;
    int u = getid(a1, a2) ^ 1;
    int v = getid(b1, b2);
    G[u][v] = 1;//构造边
    G[v^1][u^1] = 1;//构造反向边
}

bool dfs(int u){
    c[u] = -1;//作标记,正在访问
    for(int v = 0; v < 52; ++v)  if(G[u][v]){
        if(c[v] < 0)  return false;//存在有向环
        else if(!c[v] && !dfs(v))  return false;
    }
    c[u] = 1;
    return true;
}

bool toposort(){
    memset(c, 0, sizeof(c));
    for(int i = 0; i < 52; ++i)
        if(!dfs(i)) return true;
    return false;
}

int main(){
    int n;
    while(scanf("%d", &n) == 1){
        memset(G, 0, sizeof(G));
        for(int i = 0; i < n; ++i){
            scanf("%s", s);
            solve(s[0], s[1], s[2], s[3]);//考虑全了
            solve(s[4], s[5], s[6], s[7]);
            solve(s[0], s[1], s[4], s[5]);
            solve(s[0], s[1], s[6], s[7]);
            solve(s[2], s[3], s[4], s[5]);
            solve(s[2], s[3], s[6], s[7]);
        }
        if(toposort())  puts("unbounded");
        else puts("bounded");
    }
    return 0;
}
时间: 2024-11-11 20:11:20

UVa 1572 Self-Assembly (构造+拓扑排序。。。。。)的相关文章

UVa 872 - Ordering 输出全拓扑排序

本题要求输出全部拓扑排序的序列. 还好本题的数据量不是很大,限制在26个大写英文字母,故此可以使用递归法输出. 这个递归输出全部解在Leetcode很多这样的题目的,不小心的话,还是很难调试的. 总体考了递归和拓扑排序,还有判断是否可以拓扑排序-就是是否图有环. 考了三大知识点,难度还是有的.因为数据量不大,故此判断环可以使用一般递归方法,递归只需要注意细节就好了. #include <stdio.h> #include <vector> #include <string.h

UVA - 10305 - Ordering Tasks (拓扑排序!)

UVA - 10305 Ordering Tasks Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description Problem F Ordering Tasks Input: standard input Output: standard output Time Limit: 1 second Memory Limit: 32 MB John has n task

UVA 10305 Ordering Tasks (拓扑排序)

题意:给你n个点.m个关系,每个关系两个点u.v,表示u小于v,叫你输出任意一个序列保证满足所有给定的关系 例如:n=3 m=2 1 2 3 1 3 2 3 1 2 题解:拓扑排序排的是一个有向无环图(DAG),首先没有回路,否则会失败,其次如果存在G(u,v),则在该序列中u在v前面 实现方法就是遍历每个点,当此点没被标记过就进入递归 然后将此点看做树的根节点(DAG其实可以看做森林),遍历它可以到的所有点,最后从后向前将点加入排序的序列并标记 #include<cstdio> #inclu

UVA - 10305 Ordering Tasks(拓扑排序)

题意:给定优先关系进行拓扑排序. 分析:将入度为0的点加入优先队列,并将与之相连的点入度减1,若又有度数为0的点,继续加入优先队列,依次类推. #pragma comment(linker, "/STACK:102400000, 102400000") #include<cstdio> #include<cstring> #include<cstdlib> #include<cctype> #include<cmath> #i

UVA Ordering Tasks (经典拓扑排序)

   题意:n个任务,m组数据,每组数据输入x,y代表如果想要完成y任务需要先完成x任务,最后输出任务的完成顺序. 经典的拓扑排序. 代码: #include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> using namespace std; int map[105][105

Uva 10305 Ordering Tasks(拓扑排序模版题)

Uva 10305 #include<iostream> #include<queue> #define pb push_back #define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double pi=acos(-1.0); const int N=1e2+5; using namespace std; int n,m; int du[N]; vector<int>

UVa 10305 - Ordering Tasks【拓扑排序】

Ordering Tasks John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task is only possible if other tasks have already been executed. Input The input will consist of several instances of the problem. Each insta

UVA - 12263 Rankings 模拟(拓扑排序)

1 #pragma comment(linker, "/STACK:1000000000") 2 #include <bits/stdc++.h> 3 #define LL long long 4 #define INF 0x3f3f3f3f 5 #define IN freopen("E.in","r",stdin); 6 #define OUT freopen("out.txt", "w",

UVA 1572 Self-Assembly(拓扑排序)

1 // 把一个图的所有结点排序,使得每一条有向边(u,v)对应的u都排在v的前面. 2 // 在图论中,这个问题称为拓扑排序.(toposort) 3 // 不难发现:如果图中存在有向环,则不存在拓扑排序,反之则存在. 4 // 不包含有向环的有向图称为有向无环图(DAG). 5 // 可以借助DFS完成拓扑排序:在访问完一个结点之后把它加到当前拓扑序的首部. 6 7 int c[maxn]; 8 int topo[maxn],t; 9 bool dfs(int u) 10 { 11 c[u]