P1211 街道赛跑
又是一下午的杠题,累啊~~~
这道题第一问很简单,只需去掉一个点,判断能不能到达终点就行了;
第二问其实仔细想想也不难,就是判断去掉一个点后是否形成两个图;首先要知道是建立在第一问的基础上的;在加边的同时预处理一个e2的双向图,分别列举第一问的点,将从0到这个点所经过的点做标记;再将这点到终点遍历一遍,看是否遇到已标记过的点就行了。
一个160行的代码,自己看吧...
#include <bits/stdc++.h> using namespace std;
const int MAXN = 5e5 + 100;
inline int read()
{
int x = ,ff = ;char ch = getchar();
while(!isdigit(ch))
{
if(ch == '-') ff = -;
ch = getchar();
}
while(isdigit(ch))
{
x = (x<<) + (x<<) + (ch ^ );
ch = getchar();
}
return x * ff;
} inline void write(int x)
{
if(x < ) putchar('-'),x = -x;
if(x > ) write(x / );
putchar(x % + '');
} struct node
{
int y,next;
}e[MAXN],e2[MAXN << 1];
int a,tot = ,head,tail,lin[MAXN];
int tot2 = ,lin2[MAXN],vis2[MAXN];
int q[MAXN],vis[MAXN],dis[MAXN];
int f[MAXN],top = ,F[MAXN],tom = ; void add(int xx,int yy)
{
e[++tot].y = yy;
e[tot].next = lin[xx];
lin[xx] = tot;
} void add2(int xx,int yy)
{
e2[++tot2].y = yy;
e2[tot2].next = lin2[xx];
lin2[xx] = tot2;
} void Init()
{
int flag = ;
for(int i = ;;++i)
{
int x;
for(;;)
{
x = read();
if(x == -) break;
if(x == -)
{
flag = ;
break;
}
add(i,x);
add2(i,x);
add2(x,i);
}
if(flag == )
{
a = i - ;
break;
}
}
} void check(int m)
{
memset(vis,false,sizeof(vis));
vis[] = true; vis[m] = true;
head = ,tail = ;
q[] = ;
for(head = ;head <= tail;++head)
{
int x = q[head];
for(int i = lin[x],y;i;i = e[i].next)
{
if(!vis[y = e[i].y])
{
vis[y] = true;
q[++tail] = y;
}
}
}
} bool check2(int m)
{
memset(vis,false,sizeof(vis));
memset(vis2,false,sizeof(vis2));
vis[] = true; vis[m] = true;
head = ,tail = ;
q[] = ;
for(head = ;head <= tail;++head)
{
int x = q[head];
for(int i = lin2[x],y;i;i = e2[i].next)
{
if(!vis[y = e2[i].y])
{
vis[y] = true;
q[++tail] = y;
}
}
} head = ,tail = ;
q[] = m; vis2[m] = true; vis[m] = false;
for(head = ;head <= tail;++head)
{
int x = q[head];
for(int i = lin[x],y;i;i = e[i].next)
{
if(vis[y = e[i].y]) return false;
if(!vis2[y])
{
vis2[y] = true;
q[++tail] = y;
}
}
}
return true;
} int main()
{
Init();
for(int i = ;i < a;++i)
{
check(i);
if(!vis[a]) f[++top] = i;
}
write(top); putchar(' ');
for(int i = ;i <= top;++i)
{
write(f[i]);
putchar(' ');
}
putchar('\n');
for(int i = ;i <= top;++i)
{
if(check2(f[i])) F[++tom] = f[i];
}
write(tom); putchar(' ');
for(int i = ;i <= tom;++i)
{
write(F[i]);
putchar(' ');
}
return ;
}
P1211 街道赛跑的更多相关文章
- USACO Section 4
前言 好久没更新这个系列了,最近闲的无聊写一下.有两题搜索懒得写了. P2737 [USACO4.1]麦香牛块Beef McNuggets https://www.luogu.com.cn/probl ...
- struts-hibernate-ajax完成区县和街道级联下拉框功能(二补充使用json解析list结果集,ajax循环json层级处理)
针对<struts-hibernate-ajax完成区县和街道级联下拉框功能>进行补充,上一篇中,要在action中拼接JSON格式字符串,很容易手抖.直接用json处理一下转成json格 ...
- struts-hibernate-ajax完成区县和街道级联下拉框功能
前言:这次dao用的是hibernate,控制层和显示层用的是struts,页面用的是ajax... 啰嗦:我做这个用了很久,用了2周,难点没破解的地方,hibernate的多对一关系生成实体类中属性 ...
- 数据分析 - 开放街道地图(OpenStreetMap)
数据分析 - 开放街道地图(OpenStreetMap) Reinhard使用OpenStreetMap的开放地图数据作为本次数据分析的数据源,使用Python进行数据清洗,使用MongoDB进行数据 ...
- (转) C#多线程赛跑实例
专于:http://blog.csdn.net/lidatgb/article/details/8363035 结合上篇<多线程的基础>,这次我们写一个多线程的赛跑实例,内容很简单:超人和 ...
- 洛谷P1211 [USACO1.3]牛式 Prime Cryptarithm
P1211 [USACO1.3]牛式 Prime Cryptarithm 187通过 234提交 题目提供者该用户不存在 标签USACO 难度普及- 提交 讨论 题解 最新讨论 题面错误 题目描述 ...
- python 三级菜单 while循环三次,湖北省市-县-街道的选择,3个while的循环 -day2
python编写一个三级while的循环菜单 1.定义字典,字典里面嵌套字典,内嵌字典的值为列表. 思路: 湖北省的市:字典中的定义3个字典,用于存储{序列-键:市名} shiqu_dir = {} ...
- Java多线程之赛跑游戏
在JavaSE中,多线程是一个重要的内容. 我们要了解多线程的概念,就要先了解进程的概念:要了解进程的概念,就离不开操作系统的概念. 在一台正常运行的电脑中,计算机硬件(如CPU.内存.硬盘.网卡.显 ...
- C#编写街道管理系统
项目需求: 一.语言和环境 A.实现语言 C# B.环境要求 Visual Studio 2012 二.功能要求 现使用.NET WinForms技术为居委会开发一个街道管理软件,其中街道管理窗体界面 ...
随机推荐
- 【转载】分布式RPC框架性能大比拼
dubbo.motan.rpcx.gRPC.thrift的性能比较 Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 ...
- Material Design (四),AppBarLayout的使用
前言 AppBarLayout,顾名知意.就是用来给AppBar布局的容器,是LinearLayout的子类.而AppBar就包括我们通常所知道的ActionBar,Toolbar. AppBarL ...
- java设计模式----真实世界的模式
设计模式的定义: 模式是在某情境下,针对某问题的某种解决方案 反模式: 告诉你如何采用一个不好的解决方案解决一个问题 要点: 1.让设计模式自然而然地出现在你的设计中,而不是为了使用而使用 2.设计模 ...
- ORACLE数据库忘记SYS和SYSTEM密码,SYSTEM被锁定怎么办?
本人忘性太大,竟然将ORACLE的Sys用户和system用户密码搞忘,而且多次尝试登录system后,造成system被锁定. 经过一番尝试,终于解决.过程如下: 首先,重建sys密码文件.重建方式 ...
- Java中的final具体解释以及用途实战
浅析Java中的finalkeyword 谈到finalkeyword,想必非常多人都不陌生.在使用匿名内部类的时候可能会经经常使用到finalkeyword. 另外.Java中的String类就是一 ...
- 开源企业IM免费企业即时通讯ENTBOOST V2014.177版本号正式公布
版权声明:本文为博主原创文章,欢迎转载,转载请尽量保持原文章完整,谢谢! https://blog.csdn.net/yanghz/article/details/30529469 ENTBOOST, ...
- 树的深度优先遍历和广度优先遍历的原理和java实现代码
import java.util.ArrayDeque; public class BinaryTree { static class TreeNode{ int value; TreeNode le ...
- java map 装入list
需要生成多组数据的时候,应将map时候放入循环,否则循环出来会一直覆盖之前的,只能保存一条数据. 具体如下: if (rs.next()) { do { Map<String, String&g ...
- Hadoop MapReduce基本原理
一.什么是: MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算.概念"Map(映射)"和"Reduce(归约)",是它们的主要思想,都 ...
- Linux时间子系统之二:表示时间的单位和结构【转】
本文转载自:http://blog.csdn.net/droidphone/article/details/7979295 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] ...