P3436 [POI2006]PRO-Professor Szu

题目描述

n个别墅以及一个主建筑楼,从每个别墅都有很多种不同方式走到主建筑楼,其中不同的定义是(每条边可以走多次,如果走边的顺序有一条不同即称两方式不同)。

询问最多的不同方式是多少,以及有多少个别墅有这么多方式,按照顺序输出别墅编号。

如果最多不同方式超过了36500那么都视作zawsze

输入输出样例

输入样例#1:

  1. 3 5
  2. 1 2
  3. 1 3
  4. 2 3
  5. 3 4
  6. 3 4
输出样例#1:

  1. 4
  2. 1
  3. 1

这题反向建个图,缩个点,跑个topo就没了?显然没有这么容易,这里说一下题目的坑点。首先这个题目是要求从n+1号结点出发,那么如果n+1号点不能到达所有的结点会怎么样呢?

看上面这张图,假设这是我们的反向图,按理说我们应该从6号点开始topo,但是5号点自始至终都不会入队,所以说4号点的入度就不可能减到0,这样的话4号点就无法进行topo,那么这样的答案也肯定是错的。要解决这个问题也很简单,就是在缩点时只缩从n+1号点能到达的结点,然后再建新图,而且建的新图中不能含有从n+1号点不能到达的结点。

  1. tarjan(n+);//这里只从n+1号点开始缩点
  2. for(int i=;i<=n+;i++)
  3. {
  4. if(!dfn[i]) continue;//如果某一个点是n+1号点无法到达的,那么就不能把这个点加到图中
  5. for(int j=last[i];j;j=g[j].next)
  6. {
  7. int v=g[j].to;
  8. if(co[i]!=co[v])
  9. {
  10. add1(co[i],co[v]);
  11. de[co[v]]++;
  12. }
  13. }
  14. }

建图

但是这样还是A不了,这又是为啥呢?原来是自环惹的祸。

看上边的图,我们已经解决了五号点这个从起点无法到达的点的问题了,但是如果四号点给你来一个自环,那不好意思,你又挂了,要是按正常的缩点的话,四号点应该自己单独成为一个强联通分量,按理应该不需要管他,直接dp就好了,但是如果有自环,那么只要经过4号点,方案数就一定会变为正无穷,所以说,自环也是一定要考虑在内的,但是该怎么做呢,这个就更简单了,只需在读入的时候加个特判就好了,最后统计是把自环也当成环处理即可。

  1. for(int i=;i<=m;i++)
  2. {
  3. aa=read();bb=read();
  4. if(aa==bb)
  5. b[aa]=;//如果有自环,就标记一下;
  6. add(bb,aa);
  7. }

判断自环

然而这样还是A不了,这究竟是为什么呢?后来经我计算发现36500*1000000=36500000000

然后就GG了,果断#define int long long,然后就A了……

真的是巨坑无比的一道题目。

  1. #include<iostream>
  2. #include<string>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<stack>
  7. #include<queue>
  8. #define int long long
  9. #define maxn 2000005
  10. using namespace std;
  11.  
  12. struct edge
  13. {
  14. int next,to;
  15. }g[maxn<<],g1[maxn<<];
  16. int n,m,num,tot,col,num1,aa,bb,cnt,tott,pd,de[maxn],t[maxn];
  17. long long ans;
  18. long long f[maxn];
  19. int last[maxn],dfn[maxn],low[maxn],co[maxn],last1[maxn],a[maxn],b[maxn],c[maxn];
  20. stack<int>s;
  21. stack<int>ss;
  22.  
  23. inline int read()
  24. {
  25. char c=getchar();
  26. int x=,res=;
  27. while(c<''||c>'')
  28. {
  29. if(c=='-')
  30. x=-;
  31. c=getchar();
  32. }
  33. while(c>=''&&c<='')
  34. {
  35. res=res*+(c-'');
  36. c=getchar();
  37. }
  38. return x*res;
  39. }
  40.  
  41. void add(int from,int to)
  42. {
  43. g[++num].next=last[from];
  44. g[num].to=to;
  45. last[from]=num;
  46. }
  47.  
  48. void add1(int from,int to)
  49. {
  50. g1[++num1].next=last1[from];
  51. g1[num1].to=to;
  52. last1[from]=num1;
  53. }
  54.  
  55. void tarjan(int u)
  56. {
  57. dfn[u]=low[u]=++tot;
  58. s.push(u);
  59. for(int i=last[u];i;i=g[i].next)
  60. {
  61. int v=g[i].to;
  62. if(!dfn[v])
  63. {
  64. tarjan(v);
  65. low[u]=min(low[u],low[v]);
  66. }
  67. else if(!co[v])
  68. {
  69. low[u]=min(low[u],dfn[v]);
  70. }
  71. }
  72. if(low[u]==dfn[u])
  73. {
  74. col++;cnt=;
  75. for(;;)
  76. {
  77. int x=s.top();s.pop();
  78. co[x]=col;
  79. cnt++;
  80. if(x==u) break;
  81. }
  82. a[col]=cnt;
  83. }
  84. }
  85.  
  86. void topo()
  87. {
  88. ss.push(co[n+]);
  89. if(c[co[n+]]==)
  90. {
  91. f[co[n+]]=;
  92. }
  93. else
  94. {
  95. f[co[n+]]=;
  96. }
  97. while(ss.size())
  98. {
  99. int u=ss.top();ss.pop();
  100. for(int i=last1[u];i;i=g1[i].next)
  101. {
  102. int v=g1[i].to;
  103. if(c[v]==)
  104. {
  105. f[v]=;
  106. }
  107. else
  108. {
  109. f[v]+=f[u];
  110. }
  111. de[v]--;
  112. if(de[v]==)
  113. ss.push(v);
  114. }
  115. }
  116. }
  117.  
  118. signed main()
  119. {
  120. n=read();m=read();
  121. for(int i=;i<=m;i++)
  122. {
  123. aa=read();bb=read();
  124. if(aa==bb)
  125. b[aa]=;//如果有自环,就标记一下;
  126. add(bb,aa);
  127. }
  128. tarjan(n+);//这里只从n+1号点开始缩点
  129. for(int i=;i<=n+;i++)
  130. {
  131. if(!dfn[i]) continue;//如果某一个点是n+1号点无法到达的,那么就不能把这个点加到图中
  132. for(int j=last[i];j;j=g[j].next)
  133. {
  134. int v=g[j].to;
  135. if(co[i]!=co[v])
  136. {
  137. add1(co[i],co[v]);
  138. de[co[v]]++;
  139. }
  140. }
  141. }
  142. for(int i=;i<=n+;i++)
  143. {
  144. if(b[i]==)
  145. {
  146. c[co[i]]=;
  147. }
  148. if(a[co[i]]>)
  149. {
  150. c[co[i]]=;
  151. }
  152. }
  153. topo();
  154. for(int i=;i<=n;i++)
  155. {
  156. if(f[co[i]]>)
  157. {
  158. pd=;
  159. }
  160. ans=max(ans,f[co[i]]);
  161. }
  162. if(pd==)
  163. {
  164. printf("zawsze\n");
  165. for(int i=;i<=n;i++)
  166. {
  167. if(f[co[i]]>)
  168. {
  169. t[++tott]=i;
  170. }
  171. }
  172. printf("%d\n",tott);
  173. for(int i=;i<=tott;i++)
  174. {
  175. printf("%d ",t[i]);
  176. }
  177. return ;
  178. }
  179. else
  180. {
  181. printf("%lld\n",ans);
  182. for(int i=;i<=n;i++)
  183. {
  184. if(f[co[i]]==ans)
  185. t[++tott]=i;
  186. }
  187. printf("%d\n",tott);
  188. for(int i=;i<=tott;i++)
  189. {
  190. printf("%d ",t[i]);
  191. }
  192. return ;
  193. }
  194. }

P3436 [POI2006]PRO-Professor Szu的更多相关文章

  1. Tarjan&2-SAT 总结

    \(Tarjan\)&\(2-SAT\) 标签: 知识点总结 安利XZYXZY ps:里面的部分东西来自\(Anson\)和\(yler\)和\(XZY\) 阅读体验:https://zybu ...

  2. Java clone方法(下)

    1.终于调用的是一个JNI方法,即java本地方法,加高速度 2.使用clone方法,分为浅复制.深复制,这里直接使用网上抄来的案例来说明吧: 说明: 1)为什么我们在派生类中覆盖Object的clo ...

  3. [POI2006] PRO-Professor Szu

    Description \(n\) 个别墅以及一个主建筑楼,从每个别墅都有很多种不同方式走到主建筑楼,其中不同的定义是(每条边可以走多次,如果走边的顺序有一条不同即称两方式不同). 询问最多的不同方式 ...

  4. 1512: [POI2006]Pro-Professor Szu

    首先把边反向, 问题转化成求从主建筑楼走向各个点的方案数. 然后缩点,块中的方案数可以直接算. 设f[i]表示走到第i个点的方案数.显然f[i]=∑f[j](存在newedge(j,i))初始时,f[ ...

  5. Enterprise Solution 3.1 企业应用开发框架 .NET ERP/CRM/MIS 开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    行业:基于数据库的制造行业管理软件,包含ERP.MRP.CRM.MIS.MES等企业管理软件 数据库平台:SQL Server 2005或以上 系统架构:C/S 开发技术 序号 领域 技术 1 数据库 ...

  6. vs生成pro

    1.修改.vcxproj文件   <PropertyGroup Label="Globals">    <ProjectGuid>{AAAA4039-13B ...

  7. 高级渲染技巧和代码示例 GPU Pro 7

    下载代码示例 移动设备正呈现着像素越来越高,屏幕尺寸越来越小的发展趋势. 由于像素着色的能耗非常大,因此 DPI 的增加以及移动设备固有的功耗受限环境为降低像素着色成本带来了巨大的压力. MSAA 有 ...

  8. 解析大型.NET ERP系统数据访问 对象关系映射框架LLBL Gen Pro

    LLBL Gen Pro是一个为.NET开发人员设计的的对象关系映射(ORM)框架,与NHibernate,Entity Framework等框架一样,通过实体与数据表的映射,实现关系数据库持久化. ...

  9. LLBL Gen Pro 5.0 企业应用开发入门

    Solutions Design 公司于2016年5月发布了LLBL Gen Pro 5.0,这个新版本的发布出乎于我的意料.我的猜想是从4.2升级到4.5,再升级5.x版本,主版本号的变更会给原有客 ...

随机推荐

  1. 按PEP8风格自动排版Python代码

    Autopep8是一个将Python代码自动排版为PEP8风格的小工具.它使用pep8工具来决定代码中的哪部分需要被排版.Autopep8可以修复大部分pep8工具中报告的排版问题. 安装步骤如下: ...

  2. tomcat server.xml结构

    所有xml文件使用的文件头 <?xml version='1.0' encoding='utf-8'?> 2 <Server port="8005" shutdo ...

  3. Spring Boot 2.x 编写 RESTful API (六) 事务

    用Spring Boot编写RESTful API 学习笔记 Transactional 判定顺序 propagation isolation 脏读 不可重复读 幻读 不可重复读是指记录不同 (upd ...

  4. [ffmpeg] 定制滤波器

    如果有定制ffmpeg滤波器的需求,有两个结构体是必须要了解的:AVFilter.AVFilterPad,所定制的滤波器主要就是通过填充这两个结构体来实现的.我们下面将详细解析这两个结构体,并通过对滤 ...

  5. Docker常用镜像

    Docker,具有快捷方便的特性,机器上不需要安装软件和进行各种配置,拉取镜像,一行命令即可启动服务,不使用时,一行命令关闭容器即可,快捷方便,干净.利索.建议将本地的redis.mysql.kafk ...

  6. P1462 通往奥格瑞玛的道路 (二分+最短路)

    题目 P1462 通往奥格瑞玛的道路 给定\(n\)个点\(m\)条边,每个点上都有点权\(f[i]\),每条边上有边权,找一条道路,使边权和小于给定的数\(b\),并使最大点权最小. 解析 二分一下 ...

  7. windows系统下升级nodejs

    别整那些有的没得,直接Win+R 输入:npm config ls 找到nodejs安装路径 然后上nodejs官网,下载最新安装程序,指定旧版本目录,直接安装覆盖掉 啥用n模块啥得,不适合俺们微软体 ...

  8. MySQL逻辑备份into outfile

    MySQL 备份之 into outfile 逻辑数据导出(备份) 用法: select xxx into outfile '/path/file' from table_name; mysql> ...

  9. Apache的安装与配置

    apahe官网 http://www.apache.org/ 安装及配置https://blog.csdn.net/liyang4534/article/details/78036591 常见问题的处 ...

  10. hadoop记录-hadoop常用

    1.hdfs目录配额 #设置配额目录hdfs dfsadmin -setSpaceQuota 10T /user/hive/warehouser/tmp查看配额目录信息hdfs dfs -count ...