列表

详情


NC20642. 病毒感染

描述

有一天clccle和rqy走在某个国家的街头上,机智的rqy却发现周围的行人不太对劲,他们嘴里念念有词,说着"sqn tql!",一边漫无目的的行走,clccle也发现了这一点,却惊讶的发觉这种奇怪的病毒会向周围的城市,最终会感染整个国家,因为网络已经崩溃,所以她们忘记了自己所在的城市,她们唯一知道的是这种病毒是从当前她们所在的城市开始传播的,并且这个国家的所有城市到这个城市的距离和最小(所有道路的距离都为1),现在给定聪明的你一张整个国家的地图,请你帮rqy和clccle找到她们现在可能在这个国家的哪一个城市.

输入描述

两个整数n,m,代表这个国家一共有n个城市,城市之间只有m条道路

接下来m行,每行两个整数a,b代表城市a,b之间有一条联通的道路

输出描述

多个整数,输出当前clccle和rqy可能所在的点

示例1

输入:

2 1
1 2

输出:

1 2

原站题解

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

C++14(g++5.4) 解法, 执行用时: 28ms, 内存消耗: 3556K, 提交时间: 2020-07-02 10:07:17

#include<cstdio>
#include<vector>
#include<iostream>
using namespace std;

vector<int> v[50005];
int n,m,a,b,minn=(1<<30),f[50005],s[50005];

void dfs(int x,int fa){
  s[x]=1;
  for(int i=0;i<v[x].size();i++){
    int u=v[x][i];
    if(u==fa)continue;
    dfs(u,x);
    s[x]+=s[u];
    f[x]=max(f[x],s[u]);
  }
  f[x]=max(f[x],n-s[x]);
  return;
}

int main(){
  scanf("%d%d",&n,&m);
  for(int i=1;i<=m;i++){
    scanf("%d%d",&a,&b);
    v[a].push_back(b);
    v[b].push_back(a);
  }
  dfs(1,0);
  for(int i=1;i<=n;i++)minn=min(minn,f[i]);
  for(int i=1;i<=n;i++)if(f[i]==minn)printf("%d ",i);
  return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 24ms, 内存消耗: 3448K, 提交时间: 2020-03-15 11:40:53

#include<bits/stdc++.h>
using namespace std;
vector<int>ve[50005];
int f[50005],s[50005],n,mi=999999;
void dfs(int x,int fa)
{
	s[x]=1;
	for(int i=0;i<ve[x].size();i++)
	{
		int v=ve[x][i];
		if(v==fa) continue;
		dfs(v,x);
		s[x]+=s[v];
		f[x]=max(f[x],s[v]);
	}
	f[x]=max(f[x],n-s[x]);
	return;
}
int main()
{
	int m,a,b;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&a,&b);
		ve[a].push_back(b);
		ve[b].push_back(a);
	}
	dfs(1,0);
	for(int i=1;i<=n;i++)
	mi=min(mi,f[i]);
	for(int i=1;i<=n;i++)
	if(f[i]==mi) printf("%d ",i);
	printf("\n");
	return 0;
}

上一题