#3蒟蒻没有过,求调
  • 板块P1347 排序
  • 楼主cjwdyzxfblzs
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/3/2 08:58
  • 上次更新2023/10/23 23:22:42
查看原帖
#3蒟蒻没有过,求调
817044
cjwdyzxfblzs楼主2023/3/2 08:58

蒟蒻不知道为什么SPFA函数的位置不对,居然会卡一个点

#include <bits/stdc++.h>

using namespace std;

const int N = 1000;

int n, m;
int h[N], e[N], ne[N], idx;
int dist[N];
int path[N];

void add(int a, int b)
{
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx ++ ;
}

void dfs(int u)
{
    if (path[u]) dfs(path[u]);
    cout << char('A' + u - 1);
}

void SPFA(int k)
{
    // for (int i = 1; i <= n; i ++ ) dist[i] = -0x3f3f3f3f;
    memset(dist, 0, sizeof(dist));
    dist[0] = 1;
    //dist[s] = 0;
    //st[0] = true;
    queue<int> q;
    q.push(0);

    while (!q.empty())
    {
        int t = q.front(); q.pop();
        //st[t] = false;
        for (int i = h[t]; i != -1; i = ne[i])
        {
            int j = e[i];
            if (dist[j] < dist[t] + 1)
            {
                dist[j] = dist[t] + 1;
                path[n + 1] = j;
                path[j] = t;
                q.push(j);
                // if (!st[j])
                // {
                //     q.push(j);
                //     st[j] = true;
                // 
            }
            if (dist[j] > n + 2) 
            {
                cout << "Inconsistency found after " << k <<" relations." << endl;
                exit(0);
                /*
                exit() 是一个函数,系统调用级别,表示了一个进程的结束
                return 是一个函数的结束
                exit是操作系统提供的,属于库函数(stdlib.h),exit(1) 表示发生错误之后推出程序,exit(0)表示正常退出
                _exit() 函数位于unistd.h中,功能简单,直接终止进程的运行,释放使用的内存空间,销毁在内存的数据结构,exit()在进程结束之前还要检查文件的状态,将文件缓冲区的内容写回文件
                */
            }
        }
    }
    if (dist[n + 1] != n + 2 && k == m)
    {
        cout << "Sorted sequence cannot be determined." << endl;
        exit(0);
    }
    if (dist[n + 1] == n + 2)
    {
        cout << "Sorted sequence determined after " << k << " relations: ";
        dfs(path[n + 1]);
        cout << "." << endl;
        exit(0);
    }
}

bool g[N][N];

int main()
{
    memset(h, -1, sizeof(h));

    cin >> n >> m;

    for (int i = 1; i <= n; i ++ )
    {
        add(0, i); // 建立超级源点
        add(i, n + 1); // 建立超级终点
    }

    for (int i = 1; i <= m; i ++ )
    {
        char x, a, y;
        cin >> x >> a >> y;

        int u = x - 'A' + 1;
        int v = y - 'A' + 1;


        if (!g[u][v]) // 用于判断重边
        {
            g[u][v] = true;
            add(u, v);
            SPFA(i); // 判断前 i 个行不行
            *********就是这里,我把SPFA放在了这个if语句里面就没有过,但是放在外面就可以过***********
        }
        //**蒻蓟的我把SPFA放在这里就可以AC,好奇怪啊**
    }

    return 0;
}

aa

2023/3/2 08:58
加载中...