又是一下午的杠题,累啊~~~

  这道题第一问很简单,只需去掉一个点,判断能不能到达终点就行了;

  第二问其实仔细想想也不难,就是判断去掉一个点后是否形成两个图;首先要知道是建立在第一问的基础上的;在加边的同时预处理一个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 街道赛跑的更多相关文章

  1. USACO Section 4

    前言 好久没更新这个系列了,最近闲的无聊写一下.有两题搜索懒得写了. P2737 [USACO4.1]麦香牛块Beef McNuggets https://www.luogu.com.cn/probl ...

  2. struts-hibernate-ajax完成区县和街道级联下拉框功能(二补充使用json解析list结果集,ajax循环json层级处理)

    针对<struts-hibernate-ajax完成区县和街道级联下拉框功能>进行补充,上一篇中,要在action中拼接JSON格式字符串,很容易手抖.直接用json处理一下转成json格 ...

  3. struts-hibernate-ajax完成区县和街道级联下拉框功能

    前言:这次dao用的是hibernate,控制层和显示层用的是struts,页面用的是ajax... 啰嗦:我做这个用了很久,用了2周,难点没破解的地方,hibernate的多对一关系生成实体类中属性 ...

  4. 数据分析 - 开放街道地图(OpenStreetMap)

    数据分析 - 开放街道地图(OpenStreetMap) Reinhard使用OpenStreetMap的开放地图数据作为本次数据分析的数据源,使用Python进行数据清洗,使用MongoDB进行数据 ...

  5. (转) C#多线程赛跑实例

    专于:http://blog.csdn.net/lidatgb/article/details/8363035 结合上篇<多线程的基础>,这次我们写一个多线程的赛跑实例,内容很简单:超人和 ...

  6. 洛谷P1211 [USACO1.3]牛式 Prime Cryptarithm

    P1211 [USACO1.3]牛式 Prime Cryptarithm 187通过 234提交 题目提供者该用户不存在 标签USACO 难度普及- 提交  讨论  题解 最新讨论 题面错误 题目描述 ...

  7. python 三级菜单 while循环三次,湖北省市-县-街道的选择,3个while的循环 -day2

    python编写一个三级while的循环菜单 1.定义字典,字典里面嵌套字典,内嵌字典的值为列表. 思路: 湖北省的市:字典中的定义3个字典,用于存储{序列-键:市名} shiqu_dir = {} ...

  8. Java多线程之赛跑游戏

    在JavaSE中,多线程是一个重要的内容. 我们要了解多线程的概念,就要先了解进程的概念:要了解进程的概念,就离不开操作系统的概念. 在一台正常运行的电脑中,计算机硬件(如CPU.内存.硬盘.网卡.显 ...

  9. C#编写街道管理系统

    项目需求: 一.语言和环境 A.实现语言 C# B.环境要求 Visual Studio 2012 二.功能要求 现使用.NET WinForms技术为居委会开发一个街道管理软件,其中街道管理窗体界面 ...

随机推荐

  1. 基于jquery 全选、反选、各行换色、单击行选中事件实现代码

    <script language="javascript"> $(document).ready(function(){ //各行换色 $('table tr:odd' ...

  2. 面试-1-C#浅解

    面试-1   C#浅解众所周知c#是微软推出的一款完全没面向对象的编程语言,那么对象是什么?在现实生活中人们一提到对象首先想到的就是“情侣”!但是在我们的程序中对象是什么? 在程序中个能够区别于其他事 ...

  3. Node.js 爬虫批量下载美剧 from 人人影视 HR-HDTV

    这两天发现了一个叫看知乎的站点.是知乎的苏莉安做的,当中爬虫使用的 Node.js.这里就针对上一篇博客中的美剧小爬虫,改用 nodejs 进行实现一下.体验一下强大的 Node.js. 假设之前没实 ...

  4. java远程调用rmi入门实例

    RMI是Java的一组拥护开发分布式应用程序的API.RMI使用Java语言接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java Remote Method Protocol). ...

  5. (转载)解决MySql 数据库 提示:1045 access denied for user 'root'@'localhost' using password yes

    今天想用用MySQL 数据库  谁知道老提示 1045 access denied for user 'root'@'localhost' using password yes 最后在csdn 上找到 ...

  6. app直播原理

    之前写的一系列文章或者小经验一直没有时间去整理放在博客上,今天整理出来,之前是写在作业部落,语法是markdown,点击链接浏览,仅供参考,希望对你有帮助. https://www.zybuluo.c ...

  7. poj3349(hash or violence)

    Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 38600   Accep ...

  8. spark通信原理

    https://github.com/apache/spark/tree/master/core/src/main/scala/org/apache/spark/network https://git ...

  9. C# 软件实现远程桌面调用

    1.https://www.codeproject.com/Articles/19836/Palantir-Remote-Desktop-Manager codeproject项目 2.http:// ...

  10. uCos临界区保护

    定义有三种method,stm32f4采用的是第三种:将当前中断的状态标志保存在一个局部变量cpu_sr中,然后再关闭中断.cpu_sr是一个局部变量,存在于所有需要关中断的函数中.注意到,在使用了该 ...