列表

详情


NC50403. 嗅探器

描述

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

输入描述

输入文件的第一行一个整数n,表示蓝军网络中服务器的数目。
接下来若干行是对蓝军网络的拓扑结构描述,每行是两个整数i,j,表示编号为i和编号为j的两台服务器间存在连接(显然连接是双向的),服务器的编号从1开始,一行两个0表示网络的拓扑结构描述结束,再接下来是两个整数a,b,分别表示两个中心服务器的编号。

输出描述

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

示例1

输入:

5
2 1
2 5
1 4
5 3
2 3
5 1
0 0
4 2

输出:

1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 7ms, 内存消耗: 5160K, 提交时间: 2022-10-20 19:14:49

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define int long long
#define M 200005
int n,m,f;
int x,y,a,b;
vector<int>v[M];
int vis[M];
void dfs(int d,int pre,int cnt){
//    cout<<d<<endl;
    if(d==cnt || vis[d]==cnt) return;
    vis[d]=cnt;
    if(d==b){
        f=1;
        return;
    }
    for(int c:v[d]){
        if(c!=pre){
            dfs(c,d,cnt);
        }
    }
}
int solve(int x){
    f=0;
//    cout<<x<<endl;
    dfs(a,0,x);
    return f==0;
}
signed main(){
    cin>>n;
    while(cin>>x>>y &&(x+y)){
        v[x].push_back(y);
        v[y].push_back(x);
    }
    cin>>a>>b;
    for(int i=1;i<=n;i++){
        if(i!=a&&i!=b&&solve(i)){
            cout<<i<<endl;
            return 0;
        }
    }
    cout<<"No solution"<<endl;
    return 0;
}

C++ 解法, 执行用时: 44ms, 内存消耗: 428K, 提交时间: 2022-06-26 12:52:08

#include <bits/stdc++.h>
using namespace std;

const int N=105;
int n;
bool g[N][N],f[N][N];

void flody() {
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++) {
				f[i][j]|=f[i][k]&f[k][j];
			}
}

int main () {
	cin>>n;
    if(n>100) while(true);
	while(1) {
		int a,b; scanf("%d %d",&a,&b);
		if(a==0 && b==0) break;
		g[a][b]=g[b][a]=1;
	}
	int x,y; cin>>x>>y;
	for(int i=1;i<=n;i++) g[i][i]=1;
	for(int i=1;i<=n;i++) {
		if(i==x || i==y) continue;
		memcpy(f,g,sizeof g);
		for(int j=1;j<=n;j++) f[i][j]=f[j][i]=0;
		flody();
		if(!f[x][y]) {
			cout<<i<<endl;
			return 0;
		}
	}
	puts("No solution");
	return 0;
}

上一题