热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

bzoj1093:[ZJOI2007]最大半连通子图scc缩点+dag上dp

一个有向图G(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任

一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意
两点u,v,存在一条u到v的有向路径或者从v到u的有向路径。若G'=(V',E')满足V'?V,E'是E中所有跟V'有关的边,
则称G'是G的一个导出子图。若G'是G的导出子图,且G'半连通,则称G'为G的半连通子图。若G'是G所有半连通子图
中包含节点数最多的,则称G'是G的最大半连通子图。给定一个有向图G,请求出G的最大半连通子图拥有的节点数K
,以及不同的最大半连通子图的数目C。由于C可能比较大,仅要求输出C对X的余数。

解法:把scc缩点,同一个连通分量里肯定互相可达,然后变成了dag,只需要跑一个dag上dp找最长路即可,然后需要记录一下最长路方案数,需要注意的确定点之后边就确定了,所以scc缩点时需要判一下重边

/**************************************************************Problem: 1093User: walfyLanguage: C++Result: AcceptedTime:4788 msMemory:49420 kb
***************************************************************
*///#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("unroll-loops")
#include
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector
#define mod 1000000007
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m&#43;1,r,rt<<1|1
#define pil pair
#define pli pair
#define pii pair
#define cd complex
#define ull unsigned long long
#define base 1000000000000000000
#define fio ios::sync_with_stdio(false);cin.tie(0)using namespace std;const double g&#61;10.0,eps&#61;1e-11;
const int N&#61;100000&#43;10,maxn&#61;1000000&#43;10,inf&#61;0x3f3f3f3f,INF&#61;0x3f3f3f3f3f3f3f3f;int n,m,X;
stack
<int>s;
vector
<int>v[N],vv[N],ans[N];
int dfn[N],low[N];
int ins[N],inans[N];
int num,ind;
int a[maxn],b[maxn];
void tarjan(int u)
{ins[u]
&#61;2;low[u]&#61;dfn[u]&#61;&#43;&#43;ind;s.push(u);for(int i&#61;0;i){int t&#61;v[u][i];if(dfn[t]&#61;&#61;0){tarjan(t);low[u]&#61;min(low[u],low[t]);}else if(ins[t]&#61;&#61;2)low[u]&#61;min(low[u],dfn[t]);}if(low[u]&#61;&#61;dfn[u]){&#43;&#43;num;while(!s.empty()){int k&#61;s.top();s.pop();ins[k]&#61;1;ans[num].push_back(k);inans[k]&#61;num;if(k&#61;&#61;u)break;}}
}
map
int>ma;
void scc()
{
for(int i&#61;1;i<&#61;n;i&#43;&#43;)if(!dfn[i])tarjan(i);for(int i&#61;0;i){int x&#61;inans[a[i]],y&#61;inans[b[i]];if(x!&#61;y&&!ma[mp(x,y)])vv[x].pb(y),ma[mp(x,y)]&#61;1;}
}
pii dp[N];
pii DP(
int u)
{
if(dp[u].fi!&#61;-1)return dp[u];dp[u].fi&#61;ans[u].size(),dp[u].se&#61;1;for(int i&#61;0;i){int x&#61;vv[u][i];pii te&#61;DP(x);if(dp[u].fians[u].size()){dp[u]&#61;te,dp[u].fi&#61;te.fi&#43;ans[u].size();
// printf("%d %d %d %d\n",u,x,dp[u].fi,dp[u].se);
}else if(dp[u].fi&#61;&#61;te.fi&#43;ans[u].size()){dp[u].se&#61;(dp[u].se&#43;te.se)%X;
// printf("%d %d %d &#43;&#43;&#43;%d\n",u,x,dp[u].se,te.se);
}}return dp[u];
}
int main()
{scanf(
"%d%d%d",&n,&m,&X);for(int i&#61;0;i){scanf("%d%d",&a[i],&b[i]);v[a[i]].pb(b[i]);}scc();memset(dp,-1,sizeof dp);for(int i&#61;1;i<&#61;n;i&#43;&#43;)DP(i);int ma&#61;0;for(int i&#61;1;i<&#61;num;i&#43;&#43;)ma&#61;max(ma,dp[i].fi);//,printf("%d %d\n",dp[i].fi,dp[i].se);int ans&#61;0;for(int i&#61;1;i<&#61;num;i&#43;&#43;)if(dp[i].fi&#61;&#61;ma)ans&#61;(ans&#43;dp[i].se)%X;printf("%d\n%d\n",ma,ans);return 0;
}
/**********************************************/

View Code

 

转:https://www.cnblogs.com/acjiumeng/p/9000610.html



推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
author-avatar
我们的生活小窍门
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有