不知道是因为我菜还是别的,最近老是看错题。

题目描述

在有向图 GGG 中,每条边的长度均为 1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件:

  1. 路径上的所有点的出边所指向的点都直接或间接与终点连通。
  2. 在满足条件 1 的情况下使路径最短。

    注意:图 GGG 中可能存在重边和自环,题目保证终点没有出边。

请你输出符合条件的路径的长度。

Solution

  1. 定义一个点是黑点,当且仅当它能沿着边走到终点(不需满足题设条件);
  2. 定义一个点是YH点,当且仅当它引出的边指向的点都是黑点(起点终点都是YH点);
  3. 删去所有非YH点,跑 SPFA 即可。

注意反向建图

#include<cstdio>
#include<cstdlib>
#include<cstring> const int MAXN=10010;
const int MAXM=200010; struct node{
int x,y,next;
}e[MAXM];
int len=0;
int first[MAXN];
int n,m;
int sx,sy;
bool dis[MAXN];
int ST,ED;
int st,ed;
int q[MAXM*10];
int f[MAXN],v[MAXN]; void ins(int x,int y){
e[++len].x=x;e[len].y=y;
e[len].next=first[x];first[x]=len;
}
void init(){
memset(dis,1,sizeof(dis));dis[ED]=0;
st=1;ed=2;q[1]=ED;
while(st!=ed){
int x=q[st];
for(int i=first[x];i;i=e[i].next){
int y=e[i].y;
if(!dis[y]) continue;
dis[y]=0;
q[ed++]=y;
}
++st;
}
if(dis[ST]){
puts("-1");
exit(0);
}
bool rework[MAXN];
memset(rework,0,sizeof(rework));
for(int i=1;i<=n;++i)
if(dis[i]){
rework[i]=1;
for(int j=first[i];j;j=e[j].next)
rework[e[j].y]=1;
}
for(int i=1;i<=n;++i)
dis[i]=rework[i];
}
void spfa(){
memset(f,63,sizeof(f));f[ED]=0;
memset(v,0,sizeof(v));v[ED]=1;
st=1;ed=2;q[1]=ED;
while(st!=ed){
int x=q[st];
for(int i=first[x];i;i=e[i].next){
int y=e[i].y;
if(dis[y]) continue;
if(f[y]>f[x]+1){
f[y]=f[x]+1;
if(!v[y]){
v[y]=1;
q[ed++]=y;
}
}
}
++st;v[st]=0;
}
}
inline int read(){
int x=0; char c;
do c=getchar(); while(c<'0'||c>'9');
while(c>='0'&&c<='9')
x=x*10+c-48,c=getchar();
return x;
}
int main(){
n=read();m=read();
for(int i=1;i<=m;++i){
sx=read();sy=read();
ins(sy,sx);
}
ST=read();ED=read();
init();
spfa();
printf("%d",f[ST]);
}

最新文章

  1. 本地显示svg正常显示,在工程项目中无法正常显示
  2. 项目集成ReactiveCocoa遇到的坑及解决办法
  3. eclipse的快捷键大全
  4. zoj 3365
  5. C#调用C++编写的DLL函数, 以及各种类型的参数传递 z
  6. css3盒模型学习--利用box自适应布局
  7. Navicat如何导出Excel格式表结构
  8. Python 新式类与经典类
  9. Python 文档学习
  10. Linux关闭IPV6
  11. hihoCoder #1106 : Koch Snowflake 微软苏州校招笔试(1月17日)
  12. PyCharm 安装及破解方法
  13. 《AngularJS权威教程》
  14. git cherry-pick 用法
  15. homestead 添加新站点
  16. Scala_运算符
  17. 如何用MaskBlt实现两个位图的合并,从而实现背景透明
  18. Android基础总结(九)多媒体
  19. php新浪云链接mysql与storage
  20. 线段树【洛谷P2894】 [USACO08FEB]酒店Hotel

热门文章

  1. 加入百度地图遇到 framework not found BaiduMapAPI***
  2. 字节输入流InputStream
  3. charles 编辑菜单总结
  4. Leetcode 96.不同的搜索二叉树
  5. WebApi简介
  6. MySQL-Access denied for user &#39;username&#39;@&#39;localhost&#39; (using password: YES) 解决
  7. mysql 排序规则
  8. pandas.DataFrame的groupby()方法的基本使用
  9. .Net Core 商城微服务项目系列(十):使用SkyWalking构建调用链监控(2019-02-13 13:25)
  10. 【钢琴伴奏基本形态和伴奏织体】技能 get