[POI2006] PRO-Professor Szu
Description
\(n\) 个别墅以及一个主建筑楼,从每个别墅都有很多种不同方式走到主建筑楼,其中不同的定义是(每条边可以走多次,如果走边的顺序有一条不同即称两方式不同)。
询问最多的不同方式是多少,以及有多少个别墅有这么多方式,按照顺序输出别墅编号。
如果最多不同方式超过了 \(36500\) 那么都视作 \(zawsze\)
Solution
因为统计其它 \(n\) 个点到主建筑楼的方案数有点困难,我们转化一下问题,反向建边,变成求从主建筑楼到其它 \(n\) 个点的方案数,这样源点就只有一个了。
先 \(Tarjan\) 消环,然后拓扑求出从起点所在联通块到每个点所在联通块的方案数。注意到起点不一定是度数为零的点,所以不能直接将起点 \(push\) 进队列里,而是应该像常规的拓扑排序一样将所有度数为零的点 \(push\) 进去。
还有要注意的是如果当前联通块有环并且能从起点走到该联通块的话,就应该让起点到这个联通块的方案数等于 \(36501\),然后继续向下处理。(这里特别要注意能否走到该联通块)
Code
#include<queue>
#include<vector>
#include<cstdio>
#include<cctype>
#include<algorithm>
#define N 1000005
#define min(A,B) ((A)<(B)?(A):(B))
#define max(A,B) ((A)>(B)?(A):(B))
int dis[N];
int deg[N];
int n,m,pos;
int sum,tot;
int print[N];
int belong[N];
int stk[N],top;
bool in[N],is[N];
int dfn[N],low[N];
int cnt,head[N],head2[N];
std::vector<int> v[N],vans;
struct Edge{
int to,nxt;
}edge[N<<1],edge2[N<<1];
void add(int x,int y){
edge[++cnt].to=y;
edge[cnt].nxt=head[x];
head[x]=cnt;
}
void add2(int x,int y){
edge2[++cnt].to=y;
edge2[cnt].nxt=head2[x];
head2[x]=cnt;
}
int getint(){
int x=0;char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x;
}
void tarjan(int now){
dfn[now]=low[now]=++tot;
stk[++top]=now,in[now]=1;
for(int i=head[now];i;i=edge[i].nxt){
int to=edge[i].to;
if(!dfn[to]){
tarjan(to);
low[now]=min(low[now],low[to]);
}
else if(in[to])
low[now]=min(low[now],dfn[to]);
}
if(low[now]==dfn[now]){
int y; sum++;
if(stk[top]!=now) is[sum]=1;
do{
y=stk[top--];
v[sum].push_back(y);
belong[y]=sum;
in[y]=0;
}while(y!=now);
}
}
signed main(){
n=getint(),m=getint();
for(int i=1;i<=m;i++){
int x=getint(),y=getint();
add(y,x);
}
cnt=0;
for(int i=1;i<=n+1;i++){
if(!dfn[i])
tarjan(i);
}
for(int x=1;x<=n+1;x++){
for(int i=head[x];i;i=edge[i].nxt){
int to=edge[i].to;
if(belong[to]==belong[x]){
is[belong[x]]=1;
continue;
}
add2(belong[x],belong[to]);
deg[belong[to]]++;
}
}
std::queue<int> topo;
for(int i=1;i<=sum;i++){
if(!deg[i])
topo.push(i);
}
dis[belong[n+1]]=1;
while(topo.size()){
int u=topo.front();topo.pop();
if(is[u] and dis[u]) dis[u]=36501;
for(int i=head2[u];i;i=edge2[i].nxt){
int to=edge2[i].to;
dis[to]=min(dis[to]+dis[u],36501);
deg[to]--;
if(!deg[to])
topo.push(to);
}
}
int ans=0;
for(int i=1;i<=sum;i++){
dis[i]=min(dis[i],36501);
ans=max(ans,dis[i]);
}
if(ans==36501) printf("zawsze\n");
else printf("%d\n",ans);
for(int i=1;i<=n;i++){
if(dis[belong[i]]==ans)
print[++pos]=i;
}
printf("%d\n",pos);
for(int i=1;i<=pos;i++)
printf("%d ",print[i]);
puts("");
return 0;
}
[POI2006] PRO-Professor Szu的更多相关文章
- Java clone方法(下)
1.终于调用的是一个JNI方法,即java本地方法,加高速度 2.使用clone方法,分为浅复制.深复制,这里直接使用网上抄来的案例来说明吧: 说明: 1)为什么我们在派生类中覆盖Object的clo ...
- P3436 [POI2006]PRO-Professor Szu
P3436 [POI2006]PRO-Professor Szu 题目描述 n个别墅以及一个主建筑楼,从每个别墅都有很多种不同方式走到主建筑楼,其中不同的定义是(每条边可以走多次,如果走边的顺序有一条 ...
- 1512: [POI2006]Pro-Professor Szu
首先把边反向, 问题转化成求从主建筑楼走向各个点的方案数. 然后缩点,块中的方案数可以直接算. 设f[i]表示走到第i个点的方案数.显然f[i]=∑f[j](存在newedge(j,i))初始时,f[ ...
- 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 数据库 ...
- vs生成pro
1.修改.vcxproj文件 <PropertyGroup Label="Globals"> <ProjectGuid>{AAAA4039-13B ...
- 高级渲染技巧和代码示例 GPU Pro 7
下载代码示例 移动设备正呈现着像素越来越高,屏幕尺寸越来越小的发展趋势. 由于像素着色的能耗非常大,因此 DPI 的增加以及移动设备固有的功耗受限环境为降低像素着色成本带来了巨大的压力. MSAA 有 ...
- 解析大型.NET ERP系统数据访问 对象关系映射框架LLBL Gen Pro
LLBL Gen Pro是一个为.NET开发人员设计的的对象关系映射(ORM)框架,与NHibernate,Entity Framework等框架一样,通过实体与数据表的映射,实现关系数据库持久化. ...
- LLBL Gen Pro 5.0 企业应用开发入门
Solutions Design 公司于2016年5月发布了LLBL Gen Pro 5.0,这个新版本的发布出乎于我的意料.我的猜想是从4.2升级到4.5,再升级5.x版本,主版本号的变更会给原有客 ...
- adobe premiere pro cc2015.0已停止工作 解决办法
adobe premiere pro cc2015.0已停止工作 一直报错 解决办法就是: 删除我的电脑 我的饿文档下的 Adobe下的Premiere Pro文件夹 现象就是怎么重新安装都不管用P ...
随机推荐
- drf7 分页组件
DRF的分页 数据库有几千万条数据,这些数据需要展示,不可能直接从数据库把数据全部读取出来, 这样会给内存造成特别大的压力,有可能还会内存溢出,所以希望一点一点的取,那展示的时候也是一样的,总是要进行 ...
- Python自动化开发 - 堡垒机实例
本节内容 一.堡垒机介绍 1. SSHClient 2. SFTPClient 3. Transport 二.堡垒机实现 一.堡垒机介绍 1. SSHClient 用户连接远程服务器并执行基本命令 1 ...
- Django Model Form
ModelForm ModelForm结合了Form和Model,将models的field类型映射成forms的field类型,复用了Model和Model验证, 写更少的代码,并且还实现了存储数据 ...
- 电子技术经典资料汇总:PCB设计篇
电子技术经典资料汇总:PCB设计篇,下面的链接是一个一个的文件下载的,也是压缩包的内容,只不过我把他们给汇总成了一个压缩包,方便大家下载,还有更多电子技术必备基础资料,通信无线类的,C语言篇的,关于电 ...
- JavaScript实现多张图片上传功能
今天闲着没事,把之前的多张图片上传代码整理了下. 页面主要代码: <div class="upBox upBox2"> <div class="d1&q ...
- Java 中 & | ^ 运算符的简单使用
背景 今天碰到了代码中的按位与运算,复习一下,先列一个各个进制数据表. 顺便复习一下十进制转二进制的计算方式: 接下来解释下这三个运算符: & 按位与,都转为二进制的情况下,同为1则为1,否则 ...
- 再次理解HTTP请求过程[概念原理篇]
我曾多次阅读http协议,但是理解依然不深,在此,再次阅读,再次理解.加深两点:解析头部信息\r\n,分解头部和主体用\r\n\r\n.之所以一次请求会看到网络里有很多请求,是因为浏览器代替访问了多次 ...
- Tools - 源代码阅读分析工具Source Insight
简介 https://www.sourceinsight.com/ Source Insight是一个面向项目开发的程序编辑器和代码浏览器,可以分析C/C++.C#.Java.Python等语言源代码 ...
- vue 去哪网项目 学习笔记(一)
启动项 mian.js 是整个项目的入口程序 定义局部组建 components 是定义的局部组建 template 渲染app里的内容 单文件组建 单文件组建是以vue 结尾的内容 app组建的内容 ...
- ajax无刷新技术
第一步:创建ajax引擎 var xmlhttp=""; if(window.XMLHttpRequest){ xmlhttp=new XMLHttpRequest(); }els ...