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的更多相关文章

  1. Java clone方法(下)

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

  2. P3436 [POI2006]PRO-Professor Szu

    P3436 [POI2006]PRO-Professor Szu 题目描述 n个别墅以及一个主建筑楼,从每个别墅都有很多种不同方式走到主建筑楼,其中不同的定义是(每条边可以走多次,如果走边的顺序有一条 ...

  3. 1512: [POI2006]Pro-Professor Szu

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

  4. 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 数据库 ...

  5. vs生成pro

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

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

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

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

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

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

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

  9. adobe premiere pro cc2015.0已停止工作 解决办法

    adobe premiere pro cc2015.0已停止工作 一直报错 解决办法就是: 删除我的电脑  我的饿文档下的 Adobe下的Premiere Pro文件夹 现象就是怎么重新安装都不管用P ...

随机推荐

  1. (PMP)第7章-----项目成本管理

    7.1 规划成本管理 输入 工具与技术 输出 1.项目章程 2.项目管理计划 (进度管理计划, 风险管理计划) 3.事业环境因素 4.组织过程资产 1.专家判断 2.数据分析 3.会议 1.成本管理计 ...

  2. 8. American Friendship 美国式的友谊

    8. American Friendship 美国式的友谊 (1) Americans usually consider themselves a friendly people.Their frie ...

  3. docker-compose搭建mongoDB副本集(1主+1副+1仲裁)

    一.基本概念 1.副本集:一个副本集就是一组MongoDB实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成 2.主节点(master):主节点接收所有写入操作 ...

  4. 11.5 vmstat:虚拟内存统计

    vmstat vmstat是Virtual Memory Statistics(虚拟内存统计)的缩写,利用vmstat命令可以对操作系统的内存信息.进程状态和CPU活动等进行监视.但是只能对系统的整体 ...

  5. elasticsearch之入门hello(java)一

    1.书写pom.xml文件 <dependencies> <dependency> <groupId>org.elasticsearch</groupId&g ...

  6. 【python接口自动化测试教程】00---00章节就代表开篇吧

    今天突然想写个接口测试教程,由于本人是初级的比小白稍微好那么一丢丢,所以不知道能不能坚持下来 写的不对的地方还请大咖指教 先去忙自己的工作了,忙完了回来开始写第一章吧 或者先写个大纲,要不然写的章节会 ...

  7. UBUNTU14.0.4安装eclipse

    jdk工具下载地址 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 点击这个下载 ...

  8. 端口转发工具lcx使用两类

    lcx是一款强大的内网端口转发工具,用于将内网主机开放的内部端口映射到外网主机(有公网IP)任意端口.它是一款命令行工具,当然也可以在有权限的webshell下执行,正因如此lcx常被认为是一款黑客入 ...

  9. git 命令(提高篇)的本质理解

    上一篇博客:[[git 命令(提高篇)的本质理解] (http://www.cnblogs.com/juking/p/7105744.html)]介绍了Git 的基础知识 -- 提交.分支以及在提交树 ...

  10. C#实现录音录像录屏源码

    以前写过两篇录音和录像的文章(实现语音视频录制.在服务器端录制语音视频),最近有朋友问,如果要实现屏幕录制这样的功能,该怎么做了?实际上录屏的原理跟录音.录像是差不多的,如果了解了我前面两篇文章中介绍 ...