zoukankan      html  css  js  c++  java
  • CF #541div2 D

    题目本质:形成一个拓扑图,不应带自环。

    解决方法:

    1.先把等于号的部分用dsu缩点;

    2.大于和小于号建立拓扑关系;

    3.n*m的矩阵,只要用标号n+j代表m集合的第j个就从二维降到一维了;

    4.dfs查有没有环:used == 2的那种环是合法的!

     1 void dfs(int i) {
     2     used[i] = 1;
     3     for (int s : v[i]) {
     4         if (used[s] == 1) {
     5             puts("No");
     6             exit(0);
     7         }
     8         if (!used[s])    dfs(s);
     9     }
    10     used[i] = 2;
    11     order.push_back(i);
    12 }

    5.按照order记录的拓扑顺序自底向上dp一下最小取值。

    总代码:

      1 #pragma comment(linker, "/STACK:1024000000,1024000000")
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <cstdlib>
      5 #include <cmath>
      6 #include <ctime>
      7 #include <cctype>
      8 #include <climits>
      9 #include <iostream>
     10 #include <iomanip>
     11 #include <algorithm>
     12 #include <string>
     13 #include <sstream>
     14 #include <stack>
     15 #include <queue>
     16 #include <set>
     17 #include <map>
     18 #include <vector>
     19 #include <list>
     20 #include <fstream>
     21 #define ri readint()
     22 #define gc getchar()
     23 #define R(x) scanf("%d", &x)
     24 #define W(x) printf("%d
    ", x)
     25 #define init(a, b) memset(a, b, sizeof(a))
     26 #define rep(i, a, b) for (int i = a; i <= b; i++)
     27 #define irep(i, a, b) for (int i = a; i >= b; i--)
     28 #define ls p << 1
     29 #define rs p << 1 | 1
     30 using namespace std;
     31 
     32 typedef double db;
     33 typedef long long ll;
     34 typedef unsigned long long ull;
     35 typedef pair<int, int> P;
     36 const int inf = 0x3f3f3f3f;
     37 const ll INF = 1e18;
     38 
     39 inline int readint() {
     40     int x = 0, s = 1, c = gc;
     41     while (c <= 32)    c = gc;
     42     if (c == '-')    s = -1, c = gc;
     43     for (; isdigit(c); c = gc)
     44         x = x * 10 + c - 48;
     45     return x * s;
     46 }
     47 
     48 const int maxn = 1e3 + 5;
     49 int n, m;
     50 int value[maxn << 1];
     51 int used[maxn << 1];
     52 int fa[maxn << 1];
     53 char cmp[maxn][maxn];
     54 vector<int> v[maxn << 1], order;
     55 
     56 int getf(int v) {
     57     return v == fa[v] ? v : fa[v] = getf(fa[v]);
     58 }
     59 
     60 void merge(int x, int y) {
     61     int p = getf(x), t = getf(y);
     62     fa[p] = t;
     63 }
     64 
     65 void dfs(int i) {
     66     used[i] = 1;
     67     for (int s : v[i]) {
     68         if (used[s] == 1) {
     69             puts("No");
     70             exit(0);
     71         }
     72         if (!used[s])    dfs(s);
     73     }
     74     used[i] = 2;
     75     order.push_back(i);
     76 }
     77 
     78 int main() {
     79     ios_base::sync_with_stdio(false);
     80     cin.tie(0);
     81 
     82     cin >> n >> m;
     83     rep(i, 1, n + m) {
     84         fa[i] = i;
     85     }
     86 
     87     rep(i, 1, n) {
     88         rep(j, 1, m) {
     89             cin >> cmp[i][j];
     90             if (cmp[i][j] == '=') {
     91                 merge(i, n + j);
     92             }
     93         }
     94     }
     95 
     96     rep(i, 1, n) {
     97         rep(j, 1, m) {
     98             int x = getf(i), y = getf(n + j);
     99             if (cmp[i][j] == '>') {
    100                 v[x].push_back(y);
    101             } else if (cmp[i][j] == '<') {
    102                 v[y].push_back(x);
    103             }
    104         }
    105     }
    106 
    107     rep(i, 1, n + m) {
    108         if (fa[i] != i)
    109             continue;
    110         if (!used[i]) {
    111             dfs(i);
    112         }
    113     }
    114     for (int i : order) {
    115         int val = 0;
    116         for (int j : v[i]) {
    117             val = max(val, value[j]);
    118         }
    119         value[i] = val + 1;
    120     }
    121 
    122     cout << "Yes
    ";
    123     rep(i, 1, n) {
    124         cout << value[getf(i)] << " ";
    125     }
    126     cout << endl;
    127     rep(i, 1, m) {
    128         cout << value[getf(n + i)] << " ";
    129     }
    130     return 0;
    131 }
  • 相关阅读:
    JSTL fn:split()函数
    JSTL判断list是否为空
    oracle 合并列的函数wm_concat
    Eclipse软件使用说明
    Caused by: org.hibernate.HibernateException: identifier of an instance of ... is alterde from
    SpringData JPA详解
    关于JPA方法名创建自动查询
    jquery移除、绑定、触发元素事件使用示例详解
    js String对象中常用方法小结(字符串操作)
    java中list的使用方法
  • 原文地址:https://www.cnblogs.com/AlphaWA/p/10434195.html
Copyright © 2011-2022 走看看