cf 274D Lovely Matrix 拓扑排序

简介:

直接两两关系必定MLE,所以用增加冗余节点的方法。

        另外学习到了个预处理

        #pragma comment(linker, "/STACK:1024000000,1024000000")   

       修改默认栈大小,轻松克服RE


/*
author:jxy
lang:C/C++
university:China,Xidian University
**If you need to reprint,please indicate the source**
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#define INF 1E9
using namespace std;
#define maxn 100005
struct node
{
    int u;
    node *next;
};
int n,m;
node* First[maxn*2];
inline void add(int v,int u)
{
   // cout<<v<<" "<<u<<endl;
    node *s=new node;
    s->next=First[v];
    s->u=u;
    First[v]=s;
}
int a[maxn],b[maxn];
int cnt;
bool cmp(int c,int d)
{
    return a[c]<a[d];
}
void init()
{
    scanf("%d%d",&n,&m);
    memset(First,0,sizeof(First));
    int i,j,k;
    cnt=0;
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
          scanf("%d",&a[j]);
          b[j]=j;
        }
        sort(b,b+m,cmp);
        for(k=0;k<m;k++)
        {
            if(a[b[k]]==-1)continue;
            if(!k||a[b[k]]!=a[b[k-1]])cnt++;//增加冗余节点
            add(b[k],m+cnt+1);
            add(m+cnt,b[k]);
        }
        cnt++;
    }
}
int  inq[maxn*2];
int topo[maxn],t;
bool dfs(int u)
{
    inq[u]=-1;
    for(node *i=First[u];i;i=i->next)
    {
        if(inq[i->u]<0)
            return 0;
        else if(!inq[i->u]&&!dfs(i->u))return 0;
    }
    inq[u]=1;
    if(u<m) topo[--t]=u;
    return 1;
}
bool toposort()
{
    t=m;
    memset(inq,0,sizeof(inq));
    for(int u=0;u<m+cnt;u++)
        if(!inq[u]&&!dfs(u))return 0;
    return 1;
}


int main()
{
    init();
    if(!toposort())puts("-1");
    else
    {
        for(int i=0;i<m;i++)
        {
            if(i)putchar(' ');
            printf("%d",topo[i]+1);
        }
        puts("");
    }
}


目录
相关文章
|
机器学习/深度学习
poj 2155 Matrix (二维树状数组)
这是楼教主出的二维线段树或者是二维树状数组的题,题意很简单,就是有个n*n的矩阵,初始值都是0,然后给你两个操作,一个是给你左上角和右下角的坐标,把这个长方形的区间所有元素反取反(0变1 1变0),另一个是求某个具体坐标的值。 这里我用了二维的线树状数组,一维树状数组可以解决区间更新和点查询的问题,这里只需要加一维就可以了,代码比较好写,不过开始犯了很多低级的错误。
42 0
CF711D-Directed Roads(组合数学 dfs找环)
CF711D-Directed Roads(组合数学 dfs找环)
84 0
CF711D-Directed Roads(组合数学 dfs找环)
CF1365D Solve The Maze (BFS)
CF1365D Solve The Maze (BFS)
86 0
CF1365D Solve The Maze (BFS)
CF1272 E.Nearest Opposite Parity(反向建图+BFS)
CF1272 E.Nearest Opposite Parity(反向建图+BFS)
106 0
CF1272 E.Nearest Opposite Parity(反向建图+BFS)
CF 1156D. 0-1-Tree(树形DP)
CF 1156D. 0-1-Tree(树形DP)
102 0
CF191C——Fools and Roads(树上边差分+LCA)
CF191C——Fools and Roads(树上边差分+LCA)
125 0
|
Shell Windows
CF1567E. Non-Decreasing Dilemma(线段树)
CF1567E. Non-Decreasing Dilemma(线段树)
84 0
|
人工智能
CF220B Little Elephant and Array(扫描线+树状数组)
CF220B Little Elephant and Array(扫描线+树状数组)
94 0
【1105】Spiral Matrix (25分)【螺旋矩阵】
【1105】Spiral Matrix (25分)【螺旋矩阵】 【1105】Spiral Matrix (25分)【螺旋矩阵】
121 0
|
索引 Python Java
Leetcode 542:01 矩阵 01 Matrix
题目: 给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。 两个相邻元素间的距离为 1 。 Given a matrix consists of 0 and 1, find the distance of the nearest 0 for each cell.
786 0