题目链接

541div2

http://codeforces.com/contest/1131/problem/D

思路

给出n序列和m序列的相对大小关系

构造出最大值最小的序列

缩点+拓扑

小的向大的连边

相等的连个环

tarjan缩点,判断环内是否ok

最后拓扑

更新要这样

ans[v]=max(ans[v],ans[u]+1);

就是说取最后更新的一个,保证大小关系

代码

#include <bits/stdc++.h>
#define ll long long
#define iter vector<int>::iterator
using namespace std;
const int N=2007;
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
int M[N][N];
int n,m;
struct node {
int v,nxt;
}e[N*N];
int head[N*N],tot;
void add(int u,int v) {
// cout<<u<<" "<<v<<"\n";
e[++tot].v=v;
e[tot].nxt=head[u];
head[u]=tot;
}
vector<int> G[N],col[N];
char s[N];
int dfn[N],low[N],stak[N],top,vis[N],cnt,js,belong[N],rt[N];
int ans[N],ru[N];
void tarjan(int u) {
dfn[u]=low[u]=++cnt;
vis[u]=1;
stak[++top]=u;
for(iter v=G[u].begin();v!=G[u].end();++v) {
if(!dfn[*v]) {
tarjan(*v);
dfn[u]=min(dfn[u],dfn[*v]);
} else
if(vis[*v])
dfn[u]=min(dfn[u],low[*v]);
}
if(low[u]==dfn[u]) {
++js;
while(stak[top]!=u) {
vis[stak[top]]=0;
col[js].push_back(stak[top]);
belong[stak[top]]=js;
top--;
}
top--;
belong[u]=js;
vis[u]=0;
col[js].push_back(u);
}
}
queue<int> q;
int main() {
n=read(),m=read();
for(int i=1;i<=n;++i) {
scanf("%s",s+1);
for(int j=1;j<=m;++j) {
if(s[j]=='>') {
M[j+n][i]=1;
M[i][j+n]=-1;
G[j+n].push_back(i);
// cout<<j+n<<" "<<i<<"\n";
}
if(s[j]=='<') {
M[i][j+n]=1;
M[j+n][i]=-1;
G[i].push_back(j+n);
// cout<<i<<" "<<j+n<<"\n";
}
if(s[j]=='=') {
G[j+n].push_back(i);
G[i].push_back(j+n);
// cout<<j+n<<" "<<i<<"\n";cout<<i<<" "<<j+n<<"?\n";
}
}
}
// for(int i=1;i<=n+m;++i) {
// for(int j=1;j<=n+m;++j) {
// cout<<M[i][j]<<" ";
// }
// puts("");
// }
for(int i=1;i<=m+n;++i)
if(!dfn[i])
tarjan(i);
for(int i=1;i<=js;++i) {
// cout<<col[i].size()<<"!\n";
for(iter a=col[i].begin();a!=col[i].end();++a) {
for(iter b=col[i].begin();b!=col[i].end();++b) {
// cout<<*a<<" "<<*b<<" ?\n";
if(M[*a][*b]!=0) {
// cout<<*a<<" "<<*b<<"\n";
cout<<"No";
return 0;
}
}
// cout<<*a<<" ";
}
// puts("");
}
// return 0;
for(int i=1;i<=n+m;++i) {
for(int j=1;j<=n+m;++j) {
if(M[i][j]==1)
if(belong[i]!=belong[j]) {
add(belong[i],belong[j]);
// cout<<belong[i]<<" "<<belong[j]<<"!!\n";
ru[belong[j]]++;
}
}
}
// memset(ans,0x3f,sizeof(ans));
for(int i=1;i<=js;++i) if(!ru[i]) q.push(i),ans[i]=1;
while(!q.empty()) {
int u=q.front();
q.pop();
for(int i=head[u];i;i=e[i].nxt) {
int v=e[i].v;
ans[v]=max(ans[v],ans[u]+1);
ru[v]--;
if(!ru[v]) q.push(v);
}
}
// for(int i=1;i<=js;++i) cout<<ans[i]<<" ";cout<<"\n";return 0;
puts("Yes");
for(int i=1;i<=n;++i) printf("%d ",ans[belong[i]]);
puts("");
for(int i=1;i<=m;++i) printf("%d ",ans[belong[i+n]]);
return 0;
}
/*
3 3
<<<
<<=
<<=
*/

CF1131D tarjan,拓扑的更多相关文章

  1. 【bzoj1093】[ZJOI2007]最大半连通子图 Tarjan+拓扑排序+dp

    题目描述 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:对于u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径. ...

  2. 【bzoj5017】[Snoi2017]炸弹 线段树优化建图+Tarjan+拓扑排序

    题目描述 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸时,如果另一个炸弹所在位置 Xj 满足:  Xi−Ri≤Xj≤Xi+Ri,那么,该炸弹也会被引爆.  现在 ...

  3. 【tarjan 拓扑排序 dp】bzoj1093: [ZJOI2007]最大半连通子图

    思维难度不大,关键考代码实现能力.一些细节还是很妙的. Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于 ...

  4. P3387缩点(tarjan+拓扑排序+线性dp)

    题目描述 给定一个 n个点 m 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次. 输入 ...

  5. [模板][Luogu3387] 缩点 - Tarjan, 拓扑+DP

    Description 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次 ...

  6. 洛谷P1073 Tarjan + 拓扑排序 // 构造分层图

    https://www.luogu.org/problemnew/show/P1073 C国有 n n个大城市和 mm 条道路,每条道路连接这 nn个城市中的某两个城市.任意两个城市之间最多只有一条道 ...

  7. bzoj5017 炸弹 (线段树优化建图+tarjan+拓扑序dp)

    直接建图边数太多,用线段树优化一下 然后缩点,记下来每个点里有多少个炸弹 然后按拓扑序反向dp一下就行了 #include<bits/stdc++.h> #define pa pair&l ...

  8. BZOJ.2208.[JSOI2010]连通数(bitset Tarjan 拓扑)

    题目链接 先缩点,对于scc之间贡献即为szscc[i]*szscc[j] 用f[i][j]表示scci是否能到sccj 拓扑排序,每次把now的f或上to的f 用bitset优化 //63888kb ...

  9. bzoj 1093 最大半连通子图 - Tarjan - 拓扑排序 - 动态规划

    一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G'=(V ...

随机推荐

  1. Android -- 使用WindowManager实现悬浮框效果

    1,原文在这里http://blog.csdn.net/qq_17250009/article/details/52908791,我只是把里面的关键步骤给注释了一下,首先来看一下我们的效果,如图(电脑 ...

  2. idea软件上设置爱彼迎字体

  3. [ Windows BAT Script ] 删除某个目录下的所有某类文件

    删除某个目录下的所有某类文件 @echo off for /R %%s in (*.txt) do ( echo %%s del %%s ) pause @echo on

  4. 向SQL Server中导入Excel的数据

    1.  手动界面导入Excel数据 同 https://jingyan.baidu.com/article/ce09321b9a0e252bff858ff9.html 首先打开并登陆sql serve ...

  5. uva 10369 Arctic Network

    题意: 有许多基地,每个基地都有两种收发信号的方式,一种是通过无线电收发机,另一种是通过卫星.两个基地之间可以通过卫星交流不管它们相距多远:但是通过无线电交流,就要求它们的距离不超过D.为了方便布置, ...

  6. uvalive 4960 Sensor Network

    题意: 给出一个无向图,求一个生成树使得这个生成树的最大边与最小边之差最小,输出这个最小的差值.n的最大值为350. 思路: 这题不看题解想破头也不知道怎么写Orz. 暴力的做法是可以从大到小枚举边作 ...

  7. jsp登陆界面代码

    <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncod ...

  8. Spark学习之路 (三)Spark之RDD

    一.RDD的概述 1.1 什么是RDD? RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素 ...

  9. 设计模式之Interpreter(解释器)(转)

    Interpreter定义: 定义语言的文法 ,并且建立一个解释器来解释该语言中的句子. Interpreter似乎使用面不是很广,它描述了一个语言解释器是如何构成的,在实际应用中,我们可能很少去构造 ...

  10. c# 静态方法和数据

    c#所有方法都必须在类的内部声明,但如果把方法或者字段声明为static就可以使用,类名代用方法或者访问字段. 在方法中声明一个静态变量a 和一个静态的aFun方法.下面是在主函数中调用. 从上图可以 ...