【枚举染色】嗅探器 sniffer.pas/c/cpp/in/out

嗅探器

(sniffer.pas/c/cpp/in/out)

Problem

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

Input

第一行一个整数n(1<=n<=100),表示蓝军网络中服务器的数目.

接下来若干行是对蓝军网络的拓扑结构描述.

每行是两个整数i,j表示编号为I和编号为j的两台服务器间存在连接(显然连接是双向的).服务器的编号从1开始.描述以两个0结束.

再接下来一行是两个整数a,b分别表示两个中心服务器的编号.

Output

输出编号。如果有多个解输出编号最小的一个.如果找不到任何解,输出”No solution”.

Sample Input

5

2 1

2 5

1 4

5 3

2 3

5 1

0 0

4 2

 

Sample Output

 

1

 

 

首先理解一下题目。。(当时就没把题目理解清楚)

红军需要在蓝军的网络里的某一台服务器(中心服务器除外)安装嗅探器,也就是如果在1号点装了,那么所有跟1号点相连的就断了,然后从某一中心服务器开始染色,完了后判断另一中心服务器是否染色,如果染了色仍然代表可以连通,如果没有被染色就代表红军完成了任务。至于输出小的编号,从小到大枚举,找到就停止即可

C++ Code

/*
C++ Code
http://oijzh.cnblogs.com
*/
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 110

int n,a,b;
struct link{int y;link* next;};
link *head[MAXN];
bool h[MAXN];
int num;

void inlink(int x,int y)
{
    link *node=new link;
    node->y=y;
    node->next=head[x];
    head[x]=node;
}

void dfs(int x,int t)
{
    h[x]=true;
    link *node=head[x];
    while(node)
    {
        if(node->y!=t && !h[node->y]) dfs(node->y,t);
        node=node->next;
    }
}

int main()
{
    freopen("sniffer.in","r",stdin);
    freopen("sniffer.out","w",stdout);
    scanf("%d",&n);
    int i,x,y;
    while(1)
    {
        scanf("%d%d",&x,&y);
        if(x==0&&y==0)break;
        inlink(x,y);
        inlink(y,x);
    }
    scanf("%d%d",&a,&b);
    bool flag=false;
    for(i=1;i<=n;i++)
    {
        if(i==a||i==b)continue;
        memset(h,0,sizeof(h));
        dfs(a,i);
        if(!h[b]) {flag=true;break;}
    }
    if(flag)printf("%d",i);
    else printf("No solution");
    return 0;
}

  

 

posted @ 2012-10-24 14:09  jiangzh  阅读(319)  评论(0编辑  收藏  举报