zoukankan      html  css  js  c++  java
  • NOIP提高组2014——寻找道路

    赤裸裸的水题
    把所有的边反向,dfs出终点到达不了的点,把这些点及其所连点置为 “黑点”,即代码中的 (black) 数组,然后 (spfa) 过滤掉黑点就ok了

    code:

    #include<stdio.h>
    #include<queue>
    #include<cstring>
    #define inf 0x3f3f3f3f
    using namespace std;
    
    const int MAXN = 10005;
    const int MAXM = 200005;
    struct edge{
    	int u,v,nxt;
    }e[MAXM];int head[MAXN];int cnt=0;bool vis[MAXN];int black[MAXN];int dis[MAXN];
    
    inline void add(int u,int v){
    	e[++cnt].v = v;e[cnt].u= u;e[cnt].nxt = head[u];head[u] = cnt;
    }
    
    inline void dfs(int u){
    	vis[u] = 1;
    	for(int i=head[u];i;i=e[i].nxt){
    		int v=e[i].v;
    		if(!vis[v]) dfs(v);
    	}
    }
    int st,ed;
    inline void spfa(){
    	queue<int>q;
    	q.push(ed);
    	memset(dis,inf,sizeof dis);
    	vis[ed] = 1;dis[ed] = 0;
    	while(!q.empty()){
    		int h = q.front() ;q.pop() ;vis[h]=0;
    		for(int i=head[h];i;i=e[i].nxt){
    			int v = e[i].v;
    			if(black[v]) continue;
    			if(dis[h] + 1 < dis[v]){
    				dis[v] = dis[h] + 1;
    				if(!vis[v]){
    					vis[v] = 1;
    					q.push(v);
    				}
    			}
    		}
    	}
    	if(dis[st] == inf){
    		puts("-1");
    		return ;
    	}
    	printf("%d",dis[st]);
    }
    
    int main(){
    	int n,m;scanf("%d%d",&n,&m);
    	for(int i=1;i<=m;++i){
    		int u,v;scanf("%d%d",&u,&v);
    		add(v,u);
    	}
    	scanf("%d%d",&st,&ed);
    	dfs(ed);
    	for(int i=1;i<=n;++i){
    		if(!vis[i]){
    			black[i] = 1;
    			for(int j=head[i];j;j=e[j].nxt){
    				black[e[j].v] = 1;
    			}
    		}
    	}
    	memset(vis,0,sizeof vis);
    	spfa();
    	return 0;
    }
    
  • 相关阅读:
    python struct使用
    pythonunittest(1)
    python os.path模块学习(转)
    pythonunittest(2)
    主机+虚拟机Ubuntu+开发板互相ping通
    wince 外部中断调用可安装ISR错误(data abort)
    wince firstboot.nb0 的大小的问题解决
    wince 串口索引超过10个解决方法
    wince uboot 启动 wince
    zigbee 天线的设计
  • 原文地址:https://www.cnblogs.com/lajioj/p/9373937.html
Copyright © 2011-2022 走看看