• codeforces Gargari and Permutations(DAG+BFS)


     1 /*
     2      题意:求出多个全排列的lcs!
     3      思路:因为是全排列,所以每一行的每一个数字都不会重复,所以如果有每一个全排列的数字 i 都在数字 j的前面,那么i, j建立一条有向边!
     4       最后用bfs遍历整个图,求出源点到每一个点的距离,其中最大的距离就是最长的公共子序列的长度!
     5 */
     6 #include<iostream>
     7 #include<cstdio>
     8 #include<cstring>
     9 #include<algorithm>
    10 #include<queue>
    11 #include<vector>
    12 #define N 1005
    13 
    14 using namespace std;
    15 vector<int>g[N];
    16 queue<int>q;
    17 int pos[6][N];
    18 int d[N];
    19 int vis[N];
    20 int n, k;
    21 int ans;
    22 
    23 bool judge(int a, int b){//保证数字a 在数字 b的前边
    24     for(int i=1;  i<=k; ++i)
    25         if(pos[i][a] > pos[i][b])
    26             return false;
    27     return true;
    28 }
    29 
    30 void bfs(int x){
    31     q.push(x);
    32     ans=0;
    33     vis[0]=1;
    34     while(!q.empty()){
    35         int u=q.front();
    36         q.pop();    
    37         vis[u]=0;
    38         ans=max(ans, d[u]);
    39         int len=g[u].size();
    40         for(int i=0; i<len; ++i){
    41             int v=g[u][i];
    42             if(d[v]<d[u]+1){
    43                 d[v]=d[u]+1;
    44                 if(!vis[v]){
    45                     q.push(v);
    46                     vis[v]=1;
    47                 }
    48             }
    49         }
    50     }
    51 }
    52 
    53 int main(){
    54     while(scanf("%d%d", &n, &k)!=EOF){
    55         for(int i=1; i<=k; ++i)
    56             for(int j=1; j<=n; ++j){
    57                 int x;
    58                 scanf("%d", &x);
    59                 pos[i][x]=j;
    60             }
    61         for(int i=1; i<=n; ++i){
    62             d[i]=0;//初始化所有点到源点的距离都为最小(因为是求最大距离,不是最短距离)
    63             vis[i]=0;
    64             g[0].push_back(i);
    65             for(int j=i+1; j<=n; ++j)
    66                 if(judge(i, j))
    67                    g[i].push_back(j);
    68                 else if(judge(j, i))
    69                    g[j].push_back(i);
    70         }
    71         bfs(0);
    72         printf("%d
    ", ans);
    73         for(int i=0; i<=n; ++i)//不要忘记将vector清空
    74             g[i].clear();
    75     }
    76     return 0;
    77 }
  • 相关阅读:
    samba 4.11 or newer version enable SMB1
    linux下使用mv将递归的文件从多个目录移动到一个目录中
    【转载】修改Windows下键盘按键对应功能的一些方案
    ACR122U读卡器在win7以上系统使用过程中的设置项
    恢复Chrome 78以上版本的地址栏https和www显示
    配置sshd的免密码登录
    1234
    MarkDown 语法记录
    语法测试
    解决 Linux grep 不高亮显示
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/3947392.html
Copyright © 2020-2023  润新知