博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NOIP 2014 寻找道路
阅读量:5809 次
发布时间:2019-06-18

本文共 1691 字,大约阅读时间需要 5 分钟。

思路:

反向建边 看能到哪儿

再正向搞

我傻乎乎地最后竟然用了Dijkstra 普通BFS就可以

//By SiriusRen#include 
#include
#include
#include
using namespace std;#define N 250000struct node{
int at,weight;friend bool operator < (node a,node b){
return a.weight>b.weight;}}jy,tmp;priority_queue
pq;int n,first[N],next[N],v[N],tot=0,start,end,dis[N],rec[N],m,xx[N],yy[N];bool vis[N];void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}void dfs(int x){ for(int i=first[x];~i;i=next[i]){ if(!vis[v[i]]){ vis[v[i]]=1; dfs(v[i]); } }}bool check(int x){ for(int i=first[x];~i;i=next[i]){ if(!vis[v[i]])return 0; } return 1;}void Dijkstra(int x){ memset(dis,0x3f,sizeof(dis)); dis[x]=0; jy.at=x;jy.weight=0; pq.push(jy); while(!pq.empty()){ jy=pq.top();pq.pop(); if(rec[jy.at])continue; rec[jy.at]=1; for(int i=first[jy.at];~i;i=next[i]){ if(!rec[v[i]]&&dis[v[i]]>dis[jy.at]+1&&vis[v[i]]&&check(v[i])){ dis[v[i]]=dis[jy.at]+1; tmp.at=v[i]; tmp.weight=jy.weight+1; pq.push(tmp); } } }}int main(){ memset(first,-1,sizeof(first)); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d%d",&xx[i],&yy[i]),add(yy[i],xx[i]); scanf("%d%d",&start,&end); vis[end]=1;dfs(end); memset(first,-1,sizeof(first)); tot=0; for(int i=1;i<=m;i++)add(xx[i],yy[i]); Dijkstra(start); if(dis[end]<0x3ffffff)printf("%d",dis[end]); else printf("-1");}

这里写图片描述

转载于:https://www.cnblogs.com/SiriusRen/p/6532311.html

你可能感兴趣的文章
3389
查看>>
SQL Server 2008编程入门经典(第3版) 学习记录2
查看>>
Spring注解解析之ConfigurationClassPostProcessor
查看>>
进程管理工具htop/glances/dstat的使用;
查看>>
【6】Zabbix添加Discovery和auto registration
查看>>
3. 初识jmeter及如何安装
查看>>
Merge 2 given sorted interval sequences
查看>>
老李分享:jvm结构简介 2
查看>>
Linux下用户组、文件权限详解
查看>>
Linux常用命令(四)
查看>>
Linux学习笔记第七周三次课(3月21日)
查看>>
Linux学习笔记第七周一次课(3月19日)
查看>>
第五六单元练习题
查看>>
js计算时间差,包括计算,天,时,分,秒
查看>>
我的友情链接
查看>>
高效代劳工具属我最“宏
查看>>
图的搜索指的是从一个给定的顶点开始,能够到达的顶点的集合。图的搜索算法主要有广度优先搜索和深度优先搜...
查看>>
shell实战训练营Day9
查看>>
Linux安装与硬盘分区
查看>>
Java如何获取系统cpu、内存、硬盘信息
查看>>