题目连通:传送门
思路:
题目定义很清晰,然后就不会了QAQ……
后来看了书,先缩点,然后再用拓扑排序找到最长的链子的节点数(因为缩点后所有点都是一个强连通分量,所以找最长的链子就是最大限度包含
点的半连通子图)然后用dp求出由多少个长度相同的链子(e数组记录从开始到i节点所有的方案数,dis数组表示链子的节点个数,每次找到更长的链子时就更新数组,然后最后求出多少个满足最长链子的方案)。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1e6+;
int head[maxn],next[maxn],ver[maxn],tot;
int num[maxn],low[maxn],tim,co[maxn],si[maxn],col;
int st[maxn],que[maxn],top,t,w;
int du[maxn],e[maxn],ans,anss,m,n,MOD;
int x[maxn],y[maxn],nu[maxn],dis[maxn];
int MIN(int a,int b)
{
return a<b?a:b;
}
void addedge(int u,int v)
{
ver[++tot]=v;next[tot]=head[u];head[u]=tot;
}
void Tarjan(int u)
{
low[u]=num[u]=++tim;
st[++top]=u;
for(int i=head[u];i;i=next[i]){
int v=ver[i];
if(!num[v]){
Tarjan(v);
low[u]=MIN(low[u],low[v]);
}
else if(!co[v]) low[u]=MIN(low[u],num[v]);
}
if(num[u]==low[u]){
col++;
si[col]++;
co[u]=col;
while(u!=st[top]){
si[col]++;
co[st[top]]=col;
top--;
}
top--;
}
}
bool cmp(int a,int b)
{
if(x[a]!=x[b]) return x[a]<x[b];
else return y[a]<y[b];
}
void Remove()
{
for(int i=;i<=m;i++){
nu[i]=i;
x[i]=co[x[i]];
y[i]=co[y[i]];
}
sort(nu+,nu++m,cmp);
}
void Build()
{
tot=;
memset(head,,sizeof(head));
for(int i=;i<=m;i++){
int z=nu[i];
if((x[z]!=y[z])&&(x[z]!=x[nu[i-]]||y[z]!=y[nu[i-]]))
addedge(x[z],y[z]),du[y[z]]++;
}
}
void Reset()
{
for(int i=;i<=col;i++)
if(!du[i]){
que[++w]=i;
dis[i]=si[i];
e[i]=;
if(dis[i]>dis[ans]) ans=i;
}
}
void Topo()
{
while(t<w){
int u=que[++t];
for(int i=head[u];i;i=next[i]){
int v=ver[i];
--du[v];
if(dis[v]<dis[u]+si[v]){
dis[v]=dis[u]+si[v];
e[v]=;
if(dis[ans]<dis[v]) ans=v;
}
if(dis[v]==dis[u]+si[v]) e[v]=(e[v]+e[u])%MOD;
if(!du[v]) que[++w]=v;
}
}
}
void ANS()
{
for(int i=;i<=n;i++)
if(dis[i]==dis[ans]) anss=(anss+e[i])%MOD;
}
int main(void)
{
int i,j;
scanf("%d%d%d",&n,&m,&MOD);
for(i=;i<=m;i++){
scanf("%d%d",&x[i],&y[i]);
addedge(x[i],y[i]);
}
for(i=;i<=n;i++)
if(!num[i]) Tarjan(i); Remove();
Build();
Reset();
Topo();
ANS();
printf("%d\n%d",dis[ans],anss);
return ;
}
LOJ-10092(最大半连通子图)的更多相关文章
-
最大半连通子图 bzoj 1093
最大半连通子图 (1.5s 128MB) semi [问题描述] 一个有向图G = (V,E)称为半连通的(Semi-Connected),如果满足:∀ u, v ∈V,满足u->v 或 v - ...
-
BZOJ1093 [ZJOI2007]最大半连通子图
Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u ...
-
BZOJ 1093 [ZJOI2007] 最大半连通子图(强联通缩点+DP)
题目大意 题目是图片形式的,就简要说下题意算了 一个有向图 G=(V, E) 称为半连通的(Semi-Connected),如果满足图中任意两点 u v,存在一条从 u 到 v 的路径或者从 v 到 ...
-
BZOJ1093 最大半连通子图
Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意 两点u,v,存在一条u到v的有向路径或者从v到 ...
-
BZOJ 1093 [ZJOI2007]最大半连通子图
1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1986 Solved: 802[Submit][St ...
-
bzoj 1093 [ZJOI2007]最大半连通子图(scc+DP)
1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 2286 Solved: 897[Submit][St ...
-
BZOJ 1093: [ZJOI2007]最大半连通子图( tarjan + dp )
WA了好多次... 先tarjan缩点, 然后题意就是求DAG上的一条最长链. dp(u) = max{dp(v)} + totu, edge(u,v)存在. totu是scc(u)的结点数. 其实就 ...
-
[BZOJ]1093 最大半连通子图(ZJOI2007)
挺有意思的一道图论. Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:∀u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v ...
-
bzoj 1093 最大半连通子图 - Tarjan - 拓扑排序 - 动态规划
一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G'=(V ...
-
【刷题】BZOJ 1093 [ZJOI2007]最大半连通子图
Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意 两点u,v,存在一条u到v的有向路径或者从v到 ...
随机推荐
-
uva147 Dollars ——完全背包
link:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
-
优化 MySQL 中的分页
英文:Robert Eisele 译者:Giraffe 链接:http://yemengying.com/2016/05/28/optimized-pagiantion-mysql/ 一道面试的问题, ...
-
sql第二天
--基本格式 select * from tblclass --对于列进行限制 --格式一:取指定列 select cid,cname from TblClass select cname from ...
-
L2-001. 紧急救援
L2-001. 紧急救援 题目链接:https://www.patest.cn/contests/gplt/L2-001 Dijstra 本题是dijstra的拓展,在求最短路的同时,增加了不同的最短 ...
-
LeetCode-Palindromic Substrings
package Classify.DP.Medium; import org.junit.jupiter.api.Test; public class PalindromicSubstrings { ...
-
你不可不知的Java引用类型之——Reference源码解析
定义 Reference是所有引用类型的父类,定义了引用的公共行为和操作. reference指代引用对象本身,referent指代reference引用的对象,下文介绍会以reference,ref ...
-
Shell命令-文件及目录操作之pwd、rm
文件及目录操作 - pwd.rm 1.pwd:显示当前所在位置信息 pwd命令的功能说明 pwd命令用于显示当前工作目录的绝对路径,以便在各个目录间来回切换. pwd命令的语法格式 pwd [OPTI ...
-
java动态获取上传文件的编码类型
package com.sjfl.main; import java.io.BufferedReader; import java.io.File; import java.io.FileInputS ...
-
python os.system()和os.popen()
1>python调用Shell脚本,有两种方法:os.system()和os.popen(),前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程中的输出内容.>>>hel ...
-
移动端meta标签
现在的手机或平板电脑等移动设备上的浏览器默认都有双击放大的设置,如何阻止双击放大?user-scalable=no <!-- 禁止缩放 --> <meta name=”viewpor ...