codeforces Gargari and Permutations(DAG+BFS)

简介:

/*
     题意:求出多个全排列的lcs!
     思路:因为是全排列,所以每一行的每一个数字都不会重复,所以如果有每一个全排列的数字 i 都在数字 j的前面,那么i, j建立一条有向边!
      最后用bfs遍历整个图,求出源点到每一个点的距离,其中最大的距离就是最长的公共子序列的长度!
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#define N 1005

using namespace std;
vector<int>g[N];
queue<int>q;
int pos[6][N];
int d[N];
int vis[N];
int n, k;
int ans;

bool judge(int a, int b){//保证数字a 在数字 b的前边
    for(int i=1;  i<=k; ++i)
        if(pos[i][a] > pos[i][b])
            return false;
    return true;
}

void bfs(int x){
    q.push(x);
    ans=0;
    vis[0]=1;
    while(!q.empty()){
        int u=q.front();
        q.pop();    
        vis[u]=0;
        ans=max(ans, d[u]);
        int len=g[u].size();
        for(int i=0; i<len; ++i){
            int v=g[u][i];
            if(d[v]<d[u]+1){
                d[v]=d[u]+1;
                if(!vis[v]){
                    q.push(v);
                    vis[v]=1;
                }
            }
        }
    }
}

int main(){
    while(scanf("%d%d", &n, &k)!=EOF){
        for(int i=1; i<=k; ++i)
            for(int j=1; j<=n; ++j){
                int x;
                scanf("%d", &x);
                pos[i][x]=j;
            }
        for(int i=1; i<=n; ++i){
            d[i]=0;//初始化所有点到源点的距离都为最小(因为是求最大距离,不是最短距离)
            vis[i]=0;
            g[0].push_back(i);
            for(int j=i+1; j<=n; ++j)
                if(judge(i, j))
                   g[i].push_back(j);
                else if(judge(j, i))
                   g[j].push_back(i);
        }
        bfs(0);
        printf("%d\n", ans);
        for(int i=0; i<=n; ++i)//不要忘记将vector清空
            g[i].clear();
    }
    return 0;
}

目录
相关文章
Leetcode 368. Largest Divisible Subset思路及详解
这里有个很简单的数学性质,就是整除的传递性,如果a%b==0 且 b%c == 0,那么a%c == 0,说白了如果c是b的因子,b又是a的因子,那么c肯定是a的因子。这样我们就可以在数组中找出很多整除链(a->b->c->d,其中b是a的因子,c是b的因子,d是c的因子),这样的链条就满足两两整除的条件,题目就变成了求最长的链条。 先上代码,然后我再解释下我的代码。
43 0
UVa872 - Ordering(拓扑排序)
UVa872 - Ordering(拓扑排序)
57 0
|
算法
The kth great number(小根堆思想,模板题)
The kth great number(小根堆思想,模板题)
48 0
The kth great number(小根堆思想,模板题)
|
开发框架 .NET
poj 3468 A Simple Problem with Integers线段树区间修改
题目意思很简单,有N个数,Q个操作, Q l r 表示查询从l到r 的和,C l r v 表示将从l到r 的值加上v,明显的线段树,不知道线段树的人肯定暴力,肯定超时,哈哈!!
31 0
|
人工智能
poj 2299 Ultra-QuickSort 求逆序数 树状数组解法
所谓离散化,我们的了解就是对原数组排序,然后用所在位置的下标代替原数,这样我们就可以把数据范围缩小到1-500000,这个数组是开的下的。
42 0
|
人工智能
POJ 2299 Ultra-QuickSort(树状数组+离散化+求逆序数)
POJ 2299 Ultra-QuickSort(树状数组+离散化+求逆序数)
codeforces1253——D. Harmonious Graph(并查集)
codeforces1253——D. Harmonious Graph(并查集)
89 0
AtCoder Beginner Contest 223 D - Restricted Permutation(建图 思维 构造 拓扑排序)
AtCoder Beginner Contest 223 D - Restricted Permutation(建图 思维 构造 拓扑排序)
127 0
AtCoder Beginner Contest 216 G - 01Sequence (并查集 贪心 树状数组 差分约束)
AtCoder Beginner Contest 216 G - 01Sequence (并查集 贪心 树状数组 差分约束)
152 0
AtCoder Beginner Contest 216 D - Pair of Balls (思维建图 拓扑排序判断有向图是否有环)
AtCoder Beginner Contest 216 D - Pair of Balls (思维建图 拓扑排序判断有向图是否有环)
123 0