zoukankan      html  css  js  c++  java
  • [zjoi2004]嗅探器

    某军搞信息对抗实战演习.红军成功地侵入了蓝军的内部网络.

    蓝军共有两个信息中心.红军计划在某台中间服务器上安装一个嗅探器,从而能够侦听到两个信息中心互相交换的所有信息.但是蓝军的网络相当的庞大,数据包从一个信息中心传到另一个信息中心可以不止有一条通路.现在需要你尽快地解决这个问题.应该把嗅探器安装在哪个中间服务器上才能保证所有的数据包都能被捕获?

    题解:tarjan的简单应用;

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<string>
    #include<ctime>
    #include<cmath>
    #include<set>
    #include<map>
    #include<queue>
    #include<algorithm>
    #include<iomanip>
    using namespace std;
    #define FILE "dealing"
    #define up(i,j,n) for(int i=(j);i<=(n);i++)
    #define pii pair<int,int>
    #define LL int
    #define mem(f,g) memset(f,g,sizeof(f))
    namespace IO{
    	char buf[1<<15],*fs,*ft;
    	int gc(){return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?-1:*fs++;}
    	int read(){
    		int ch=gc(),f=0,x=0;
    		while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=gc();}
    		while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=gc();}
    		return f?-x:x;
    	}
    	int readint(){
    		int ch=getchar(),f=0,x=0;
    		while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}
    		while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    		return f?-x:x;
    	}
    }using namespace IO;
    const int maxn=101000,inf=100000000;
    int n,m;
    int s,t,x,y;
    struct node{
    	int y,next;
    }e[maxn<<1];
    int len=0,linkk[maxn];
    void insert(int x,int y){e[++len].y=y;e[len].next=linkk[x];linkk[x]=len;}
    int pre[maxn],low[maxn],fa[maxn],dfs_clock=0;
    int ans=inf;
    void updata(int x){if(x!=s&&x!=t)if(ans>x)ans=x;}
    int tarjan(int x){
    	int flag=0,h;
    	if(x==t)flag=1;
    	low[x]=pre[x]=++dfs_clock;
    	for(int i=linkk[x];i;i=e[i].next){
    		if(e[i].y==fa[x])continue;
    		fa[e[i].y]=x;
    		if(!pre[e[i].y]){
    			if(h=tarjan(e[i].y))flag=1;
    			if(h&&low[e[i].y]>=pre[x])updata(x);
    			if(low[e[i].y]<low[x])low[x]=low[e[i].y];
    		}
    		else if(pre[e[i].y]<low[x])low[x]=pre[e[i].y];
    	}
    	return flag;
    }
    int main(){
    	freopen(FILE".in","r",stdin);
    	freopen(FILE".out","w",stdout);
    	n=read();
    	while(true){
    		x=read(),y=read();
    		if(!x&&!y)break;
    		insert(x,y);insert(y,x);
    	}
    	s=read(),t=read();
    	tarjan(s);
    	if(ans!=inf)printf("%d
    ",ans);
    	else printf("No solution
    ");
    	return 0;
    }
    

      

  • 相关阅读:
    71 是否同一棵二叉搜索树(25 分)
    75 平衡二叉树的根(25 分)
    72 树种统计(25 分)
    2018(容斥定理 HDU6286)
    直观的理解计算机中的数值编码
    如何关闭emacs开启时自己打开的欢迎界面
    图论:最短路径:广度优先搜索(C语言实现)
    ubunut 14.04 将Caps Lock设置为Control
    邻接表:C语言实现
    队列(C语言实现)
  • 原文地址:https://www.cnblogs.com/chadinblog/p/6142894.html
Copyright © 2011-2022 走看看