CF1131D tarjan,拓扑
题目链接
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,拓扑的更多相关文章
- 【bzoj1093】[ZJOI2007]最大半连通子图 Tarjan+拓扑排序+dp
题目描述 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:对于u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径. ...
- 【bzoj5017】[Snoi2017]炸弹 线段树优化建图+Tarjan+拓扑排序
题目描述 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸时,如果另一个炸弹所在位置 Xj 满足: Xi−Ri≤Xj≤Xi+Ri,那么,该炸弹也会被引爆. 现在 ...
- 【tarjan 拓扑排序 dp】bzoj1093: [ZJOI2007]最大半连通子图
思维难度不大,关键考代码实现能力.一些细节还是很妙的. Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于 ...
- P3387缩点(tarjan+拓扑排序+线性dp)
题目描述 给定一个 n个点 m 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次. 输入 ...
- [模板][Luogu3387] 缩点 - Tarjan, 拓扑+DP
Description 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次 ...
- 洛谷P1073 Tarjan + 拓扑排序 // 构造分层图
https://www.luogu.org/problemnew/show/P1073 C国有 n n个大城市和 mm 条道路,每条道路连接这 nn个城市中的某两个城市.任意两个城市之间最多只有一条道 ...
- bzoj5017 炸弹 (线段树优化建图+tarjan+拓扑序dp)
直接建图边数太多,用线段树优化一下 然后缩点,记下来每个点里有多少个炸弹 然后按拓扑序反向dp一下就行了 #include<bits/stdc++.h> #define pa pair&l ...
- BZOJ.2208.[JSOI2010]连通数(bitset Tarjan 拓扑)
题目链接 先缩点,对于scc之间贡献即为szscc[i]*szscc[j] 用f[i][j]表示scci是否能到sccj 拓扑排序,每次把now的f或上to的f 用bitset优化 //63888kb ...
- bzoj 1093 最大半连通子图 - Tarjan - 拓扑排序 - 动态规划
一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G'=(V ...
随机推荐
- Mockito/PowerMockito Straige Issues
http://blog.csdn.net/xiaoyaoyulinger/article/details/52415494 http://breezylee.iteye.com/blog/208843 ...
- HTML/HTML5 Input类型&&表单
1.HTML 中"不常用"input类型中的属性值: disabled:输入字段禁用: maxlength:输入字段的最大字符长度: readonly:输入字符只读,无法修改: s ...
- 20155228 2016-2017-2 《Java程序设计》第2周学习总结
20155228 2006-2007-2 <Java程序设计>第2周学习总结 教材学习内容总结 类型 Java可以区分为基本类型和类类型(或称参考类型).对于基本类型,使用时得考虑一下数据 ...
- Spark学习之路 (二十三)SparkStreaming的官方文档
一.SparkCore.SparkSQL和SparkStreaming的类似之处 二.SparkStreaming的运行流程 2.1 图解说明 2.2 文字解说 1.我们在集群中的其中一台机器上提交我 ...
- Win7 Python开发环境搭建
1. 下载Anaconda并安装 地址: https://www.anaconda.com/download/ Anaconda包括Python基础包与一系列科学计算包,安装后不用再单独安装Pyth ...
- CSRF(跨站请求伪造)攻击
CSRF(跨站请求伪造)攻击 CSRF(Cross Site Request Forgery,跨站请求伪造)是一种近年来才逐渐被大众了解的网络攻击方式,又被称为One-Click Attack或Ses ...
- 【Alpha版本】冲刺阶段——Day7
[Alpha版本]冲刺阶段--Day7 阅读目录 今日进展 今日贡献量 贡献量汇总 TODOList 及项目燃尽图 [今日进展] 将项目源文件打成jar包,并运行测试 完成答辩ppt 项目运行情况 主 ...
- <转>jmeter(十二)关联之正则表达式提取器
本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...
- RTMP HLS HTTP 直播协议一次看个够
直播从2016年一路火到了2017年,如今要在自己的App里加入直播功能,只要找一个现成的SDK就行了,什么拍摄.美颜.推流,一条龙服务.不过作为直播身后最重要的部分:推流协议,很多人并不是很清楚.如 ...
- Wisdom RESTClient支持自动化测试并可以生成API文档
Wisdom REST Client V1.2 支持自动化测试RESTful API并生成精美的测试报告,同时基于历史数据自动生成精美的RESTful API文档. 工具地址:https://gith ...