$Luogu$

$Sol$

首先找出符合条件一的点然后跑$SPFA$就好了叭.

如何判断点是否符合条件一呢?先连反边,记录每个点的入度,然后从终点开始$dfs$,记录每个点被到达的次数,若到达的次数等于它的入度且不为$0$那么就是满足题意的.

为啥$Noip2014$有$4$道连我都觉得很水的题.

$Code$

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define il inline
#define Rg register
#define go(i,a,b) for(Rg int i=a;i<=b;++i)
#define yes(i,a,b) for(Rg int i=a;i>=b;--i)
#define e(i,u) for(Rg int i=b[u];i;i=a[i].nt)
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define db double
#define inf 2147483647
using namespace std;
il int read()
{
Rg int x=,y=;char c=getchar();
while(c<''||c>''){if(c=='-')y=-;c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
const int N=,M=;
int n,m,b[N],ct,du[N],s,t,vis[N],dis[N];
bool fl[N];
queue<int>q;
struct nd1{int u,v;}eg[M];
struct nd{int v,nt;}a[M];
il void add(int u,int v){a[++ct]=(nd){v,b[u]};b[u]=ct;}
il void dfs(int u)
{
e(i,u)
{
Rg int v=a[i].v;vis[v]++;
if(vis[v]>)continue;
dfs(v);
}
}
il void SPFA()
{
mem(vis,);mem(dis,);
vis[s]=;dis[s]=;q.push(s);
while(!q.empty())
{
Rg int u=q.front();q.pop();vis[u]=;
e(i,u)
{
Rg int v=a[i].v;
if(!fl[v])continue;
if(dis[v]>dis[u]+)
{
dis[v]=dis[u]+;
if(!vis[v]){vis[v]=;q.push(v);}
}
}
}
}
il bool cmp(nd1 x,nd1 y){return x.u==y.u?x.v<y.v:x.u<y.u;}
int main()
{
n=read(),m=read();
go(i,,m)
{
Rg int u=read(),v=read();
if(u==v)continue;
eg[i]=(nd1){u,v};//add(v,u);du[u]++;
}
sort(eg+,eg+m+,cmp);
Rg int nm=;
go(i,,m)
{
if(eg[i].u==eg[i-].u && eg[i].v==eg[i-].v){nm++;continue;}
add(eg[i].v,eg[i].u);du[eg[i].u]++;
}
m-=nm;
s=read(),t=read();swap(s,t);
vis[s]=;dfs(s);
go(i,,n)if((vis[i]==du[i]&&vis[i])||i==s)fl[i]=;
if(!fl[s]){printf("-1\n");return ;}
SPFA();
if(dis[t]>M)printf("-1\n");
else printf("%d\n",dis[t]);
return ;
}

随机推荐

  1. Java模板引擎FreeMarker介绍和使用

    http://blog.csdn.net/shimiso/article/details/8778793

  2. oracle用Where子句替换HAVING子句

    避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销. 例如: 低效: ...

  3. Getting started with the basics of programming exercises_2

    1.编写简单power函数 #include<stdio.h> int power(int m, int n); // test power function int main(void) ...

  4. Web应用中request获取path,URI,URL

    Web应用中有各种获取path或URI,URL的方法,假设网页访问地址: http://localhost:8080/tradeload/TestServlet Web应用context: /trad ...

  5. 【Activiti工作流引擎】官方快速入门demo

    Activiti官方快速入门demo 地址: https://www.activiti.org/quick-start 0. 版本 activiti 5.22.0 JDK 1.8 1. 介绍 这个快速 ...

  6. vue+file-saver+xlsx导出table表格为excel

    https://blog.csdn.net/wjswangjinsheng/article/details/91393396

  7. rsa加密(非对称加密)

    rsa加密 是非对称加密 需要公钥 与 私钥 这个公钥私钥的具体值需要与后端协商定下 rsa js代码如下 代码太多不插入了 html代码如下 <!DOCTYPE html> <ht ...

  8. 【知识小结】PHP使用svn笔记总结

    在公司里,我们要养成每天上班前更新代码,下班前提交代码的习惯,并且做好说明. svn更新代码的时候,先右键点击需要更新的项目,在team中进入资源库同步界面,选择incoming mode,显示的文件 ...

  9. MATLAB常用函数, 常见问题

    MATLAB常用函数 1.常用取整函数 round(x):四舍五入函数 floor(x) : 向下取整, 即 floor(1.2)=1,  floor(1.8) = 1 ceil(x) : 向上取整, ...

  10. UVA 11400"Lighting System Design"

    传送门 错误思路 正解 AC代码 参考资料: [1]:https://www.cnblogs.com/Kiraa/p/5510757.html 题意: 现给你一套照明系统,这套照明系统共包含 n 种类 ...