首页 > 其他分享 >洛谷-1347

洛谷-1347

时间:2022-11-20 16:13:41浏览次数:76  
标签:洛谷 cout idx int res 1347 vis st

洛谷-1347

思路

此题解的思路再加上这篇blog的代码实现。

注意:本体要求的不是一个拓扑排序就可以了,实际上是要求一条链的拓扑排序。

Code

#include <bits/stdc++.h>
using namespace std;
#define _u_u_ ios::sync_with_stdio(false), cin.tie(nullptr)
#define cf int _o_o_;cin>>_o_o_;for (int Case = 1; Case <= _o_o_;Case++)
#define SZ(x) (int)(x.size())
inline void _A_A_();
signed main() {_A_A_();return 0;}

using ll = long long;
// #define int long long
const int mod = 1e9 + 7;
const int maxn = 2e5 + 10;
const int N = 210, M = 5010;
const int inf = 0x3f3f3f3f;

struct edge {
    int to, nxt;
}e[610];

int vis[26];    // 0->未访问;1->正在访问;-1->已经访问过
int idx, h[610], n , m, now=1;

void add(int u,int v) {
    e[idx].to = v;
    e[idx].nxt = h[u];
    h[u] = idx++;
}

vector<int> res;    // 记录拓扑序
set<int> st;    // 记录现在已经出现过的点(实际上没啥用

bool dfs(int u) {
    vis[u] = 1;
    for (int i = h[u];i != -1;i =e[i].nxt) {
        if (vis[e[i].to] == 1) return 1;
        if (vis[e[i].to] == 0 && dfs(e[i].to)) return 1;
    }
    vis[u] = -1;
    res.push_back(u);
    return 0;
}

void topo() {
    res.clear();
    memset(vis, 0,sizeof vis);
    for (auto i : st) { // 实际上可以从0到n-1
        if (!vis[i] && dfs(i)) {
            cout << "Inconsistency found after " << now << " relations.\n";
            exit(0);
        }
    }
    if (SZ(res) == n) {
        int cnt = 0;    // 这里用来判断是否是链
        for (int i = n - 1;i >= 1;i -- ) {  // 判断每两个相邻的节点是否连边
            bool flag = 0;
            int a = res[i], b = res[i - 1]; // 数据很水,这里写成a = i, b = i-1可以拿90分。
            for (int k = h[a];k != -1;k = e[k].nxt) {
                if (e[k].to == b) {
                    flag = 1;
                }
            }
            if (flag) cnt++;
        }
        if (cnt == n - 1) { // 是链
            cout << "Sorted sequence determined after " << now << " relations: ";
            for (int i = n - 1;i >= 0;i--) {
                char t = res[i] + 'A';
                cout << t ;
            }
            cout  << ".\n";
            exit(0);
        }
    }
}

inline void _A_A_() {
    #ifdef LOCAL
    freopen("in.in", "r", stdin);
    #endif
    _u_u_;
    memset(h, -1, sizeof h);
    cin >> n >> m;
    string s;
    for (;now <= m;now++)  {
        cin >> s;
        add(s[0] - 'A', s[2] - 'A');
        st.insert(s[0] - 'A');
        st.insert(s[2] - 'A');
        topo();
    }
    cout << "Sorted sequence cannot be determined.\n";
}

标签:洛谷,cout,idx,int,res,1347,vis,st
From: https://www.cnblogs.com/FanWQ/p/16908728.html

相关文章

  • 洛谷P1270 “访问”美术馆 树形dp
    题意https://www.luogu.com.cn/problem/P1270分析经典的树上背包,令\(dp[x][t]\)表示在\(x\)点剩余\(t\)秒的最多画数在\(x\)结点考虑分给左右结点的时间,故枚举分给左儿......
  • 洛谷:P1789 【Mc生存】插火把
        代码:#include<stdio.h>structhuobaye{intx;inty;};structstoneye{intx;inty;};intabs(intn){intflag;if(......
  • 洛谷P3917 异或序列
     题意:给出一个大小为n的序列a[n],求∑1≤i≤j≤n Ai​⨁Ai+1​⨁⋯⨁Aj的值​分析:根据异或的性质我们很容易想到一个O(n*n)的做法,即进行一个异或前缀和。......
  • 【洛谷 P4525】 【模板】自适应辛普森法 1
    自适应辛普森法,用于求定积分。原理是不断二分区间直到区间的积分和二次函数的积分拟合程度足够高,然后用二次函数的积分值来代替原积分值。#include<bits/stdc++.h>#def......
  • 洛谷P1706 全排列问题
    全排列问题题目描述P1706全排列问题-洛谷按照字典序输出自然数\(1\)到\(n\)所有不重复的排列,即\(n\)的全排列,要求所产生的任一数字序列中不允许出现重复的数字......
  • 【洛谷P3810】 【模板】三维偏序(陌上花开)
    CDQ是一中思想,用来求点对数列。定义\(solve(l,r)\)用来求\([l,r]\)区间的数对,那么先递归处理\(solve(l,mid)\),然后考虑前半段对后半段的影响,然后再递归处理后半段\(sol......
  • 洛谷-3758
    洛谷-3758思路一定要看数据范围!Code#include<bits/stdc++.h>usingnamespacestd;#define_u_u_ios::sync_with_stdio(false),cin.tie(nullptr)#definecfint_......
  • 洛谷刷题_P1255 数楼梯
    题目P1255数楼梯题目链接https://www.luogu.com.cn/problem/P1255知识点斐波那契数列斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、34、……,在数学上,......
  • 邮递员送信(洛谷1629)
    ​​传送门​​​第一反应是Floyd,但是看看数据规模,会tle那就考虑n次单源最短路,但是即使是SPFA,也会t那肯定就另有玄机。我们每次出去送货后都要直接返回邮局,所以我们需要......
  • 洛谷-1714
    洛谷-1714思路求连续子段,显然需要前缀和处理一下,问题就变成了求出\(i,j\)使得\[\max\{s[i]-s[j]\},i-j>m\]于是利用双端队列从每个区间的max-min中找答案。但......