BZOJ 1093 强连通缩点+DAG拓扑DP
缩点后在一个DAG上求最长点权链 和方案数
注意转移条件和转移状态
if (nowmaxn[x] > nowmaxn[v]) {
ans[v] = ans[x];
nowmaxn[v] = nowmaxn[x];
} else if (nowmaxn[x] == nowmaxn[v]) {
ans[v] = (ans[v] + ans[x]) % X;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = ;
const int MAXM = ;
int deep, colorsum = ;
int top;/*sta目前的大小*/
int dfn[MAXN], color[MAXN], low[MAXN];
int sta[MAXN];//存着当前所有可能能构成强连通分量的点
bool visit[MAXN];//表示一个点目前是否在sta中
int cnt[MAXN];//各个强连通分量中含点的数目
int to[MAXM << ], nxt[MAXM << ], Head[MAXN], ed = ;
inline void addedge(int u, int v)
{
to[++ed] = v;
nxt[ed] = Head[u];
Head[u] = ed;
}
void tarjan(int x)
{
dfn[x] = ++deep;
low[x] = deep;
visit[x] = ;
sta[++top] = x;
for (int i = Head[x]; i; i = nxt[i]) {
int v = to[i];
if (!dfn[v]) {
tarjan(v);
low[x] = min(low[x], low[v]);
} else {
if (visit[v]) {
low[x] = min(low[x], low[v]);
}
}
}
if (dfn[x] == low[x]) {
color[x] = ++colorsum;
visit[x] = ;
while (sta[top] != x) {
color[sta[top]] = colorsum;
visit[sta[top--]] = ;
}
top--;
}
}
int X;
int du[MAXN];
vector<int> g[MAXN];
map<pair<int, int>, int> mp, mp2;
queue<int> que;
int ans[MAXN];
int nowmaxn[MAXN];
int main()
{
int n, m;
int u, v;
scanf("%d %d %d", &n, &m, &X);
for (int i = ; i <= m; i++) {
scanf("%d %d", &u, &v);
if (!mp2[make_pair(u, v)]) {
addedge(u, v);
mp2[make_pair(u, v)] = ;
}
}
for (int i = ; i <= n; i++) {
if (!dfn[i]) {
tarjan(i);
}
cnt[color[i]]++;
}
for (u = ; u <= n; u++) {
int x = color[u];
for (int i = Head[u]; i; i = nxt[i]) {
v = to[i];
int y = color[v];
if (x != y) {
if (!mp[make_pair(x, y)]) {
g[x].push_back(y);
du[y]++;
mp[make_pair(x, y)] = ;
}
}
}
}
for (int i = ; i <= colorsum; i++) {
if (du[i] == ) {
que.push(i);
ans[i] = ;
}
}
while (que.size()) {
int x = que.front();
que.pop();
nowmaxn[x] += cnt[x];
for (int i = ; i < g[x].size(); i++) {
v = g[x][i];
if (nowmaxn[x] > nowmaxn[v]) {
ans[v] = ans[x];
nowmaxn[v] = nowmaxn[x];
} else if (nowmaxn[x] == nowmaxn[v]) {
ans[v] = (ans[v] + ans[x]) % X;
}
du[v]--;
if (du[v] == ) {
que.push(v);
}
}
}
int anser = ;
int maxnn = ;
for (int i = ; i <= colorsum; i++) {
if (nowmaxn[i] > maxnn) {
anser = ans[i];
maxnn = nowmaxn[i];
} else if (nowmaxn[i] == maxnn) {
anser = (anser + ans[i]) % X;
}
}
cout << maxnn << endl;
cout << anser << endl; }
BZOJ 1093 强连通缩点+DAG拓扑DP的更多相关文章
- UVA 11324 The Largest Clique(强连通分量+缩点DAG的DP)
题意:给定一个有向图,求出一个最大的结点集,这个节点集中的随意两个点之间至少一个能到达还有一个点. 思路:假设一个点在这个节点集中,那么它所在的强连通分量中的点一定所有在这个节点集中,反之亦然, 求出 ...
- BZOJ 5450 轰炸 (强连通缩点+DAG最长路)
<题目链接> 题目大意: 有n座城市,城市之间建立了m条有向的地下通道.你需要发起若干轮轰炸,每轮可以轰炸任意多个城市.但每次轰炸的城市中,不能存在两个不同的城市i,j满足可以通过地道从城 ...
- bzoj1179: [Apio2009]Atm scc缩点+dag上dp
先把强连通缩点,然后变成了dag,dp求终点是酒吧的最长路即可, /************************************************************** Pro ...
- bzoj1093: [ZJOI2007]最大半连通子图 scc缩点+dag上dp
一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G'=(V ...
- Tarjan缩点+DAG图dp
题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只 ...
- UVA - 11324 The Largest Clique 强连通缩点+记忆化dp
题目要求一个最大的弱联通图. 首先对于原图进行强连通缩点,得到新图,这个新图呈链状,类似树结构. 对新图进行记忆化dp,求一条权值最长的链,每一个点的权值就是当前强连通分量点的个数. /* Tarja ...
- BZOJ5017 [Snoi2017]炸弹[线段树优化建边+scc缩点+DAG上DP/线性递推]
方法一: 朴素思路:果断建图,每次二分出一个区间然后要向这个区间每个点连有向边,然后一个环的话是可以互相引爆的,缩点之后就是一个DAG,求每个点出发有多少可达点. 然后注意两个问题: 上述建边显然$n ...
- POJ 1236 学校传数据 强连通+缩点+DAG
题意描述: 网络中有一些学校,每个学校可以分发软件给其他学校.可以向哪个分发取决于他们各自维护的一个清单. 两个问题 1:至少要copy多少份新软件给那些学校, 才能使得每个学校都能得到. 2:要在所 ...
- [模板][Luogu3387] 缩点 - Tarjan, 拓扑+DP
Description 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次 ...
随机推荐
- NDK学习笔记-文件的拆分与合并
文件的拆分与合并在开发中经常会用到,上传或是下载的时候都有这样的运用 文件拆分的思路 将文件大小拆分为n个文件 那么,每个文件的大小就是等大小的 如果文件大小被n除不尽,那么就使用n+1个文件来拆分 ...
- [转帖]linux各种IPC机制
linux各种IPC机制 docker中的资源隔离,一种就是IPC的隔离.IPC是进程间通信. 下面的文章转载自https://blog.csdn.net/yyq_9623/article/detai ...
- MYSQL SHOW 用法
1.SHOW CHARACTER SET 显示所有可用的字符集 mysql> SHOW CHARACTER SET LIKE 'utf8'; +---------+--------------- ...
- APM之原理篇
APM,应用性能监控,有new relic等产品,对APM感兴趣的应该不会不知道它了.主要功能就是统计分析应用的CPU.内存.网络.数据库.UI等性能,并提供错误日志捕获.编码人员需要做的仅仅是使用它 ...
- 封装PHP增删改查方法
<?php class sqlModel{ public $db; public function __construct(){ try{ $dbms='mysql';//数据库类型 $dbNa ...
- js图片压缩上传
最近公司的移动产品相约app要做一次活动,涉及到图片上传,图片又不能太大,不然用户体验太差,必须先压缩再上传,所以用到了html5的canvas和FileReader,代码先上,小弟前端经验不足,代码 ...
- maven中添加memcached.jar配置方法
一.java memcached client的jar包下载地址:https://github.com/gwhalin/Memcached-Java-Client/downloads 二.cd jav ...
- Sql Server 分区演练
USE [master] GO if exists (select * from sys.databases where name = 'Test_1') drop database Test_1 G ...
- Unsupported major.minor version 52.0错误和 jdbc odbc
什么是JDBC? JDBC, 全称为Java DataBase Connectivity standard, 它是一个面向对象的应用程序接口(API), 通过它可访问各类关系数据库.JDBC也是jav ...
- mbedtls 入门
mbedtls 入门 https://segmentfault.com/a/1190000012007117 ARM mbedtls使开发人员可以非常轻松地在嵌入式产品中加入加密和SSL/TLS功能. ...