首页 > 代码库 > codeforces Gargari and Permutations(DAG+BFS)
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 100513 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\n", ans);73 for(int i=0; i<=n; ++i)//不要忘记将vector清空74 g[i].clear();75 }76 return 0;77 }
codeforces Gargari and Permutations(DAG+BFS)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。