题目链接
题目描述
共有 位成员,给出
对互为好友的关系(无向边)。记成员
的社牛指数为其好友数
;朋友平均社牛指数为
。若
,则称
为社牛。请按字典序输出所有社牛成员的姓名;若不存在,输出
None
。
输入:
- 第一行两个整数
、
- 接下来
行,每行两个字符串
、
表示
与
互为好友
输出:
- 一行若干个字符串,按字典序升序输出所有社牛;若不存在仅输出
None
解题思路
- 将姓名离散化为编号,建无向图。
- 先统计每个成员的度数
;再对每个成员求其邻居度数之和
。
- 判断条件等价于
(当
时无朋友,视为非社牛)。
- 将满足条件的姓名收集并按字典序排序输出。
- 复杂度:建图与求和
,排序输出
。
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
if (!(cin >> n >> m)) return 0;
unordered_map<string, int> id;
vector<pair<string,string>> edges;
edges.reserve(m);
int idx = 0;
for (int i = 0; i < m; ++i) {
string u, v; cin >> u >> v;
edges.emplace_back(u, v);
if (!id.count(u)) id[u] = idx++;
if (!id.count(v)) id[v] = idx++;
}
int N = idx;
vector<vector<int>> g(N);
vector<int> deg(N, 0);
vector<string> names(N);
for (auto &kv : id) names[kv.second] = kv.first;
for (auto &e : edges) {
int u = id[e.first], v = id[e.second];
g[u].push_back(v);
g[v].push_back(u);
deg[u]++; deg[v]++;
}
vector<long long> sumNei(N, 0);
for (int u = 0; u < N; ++u) {
long long s = 0;
for (int v : g[u]) s += deg[v];
sumNei[u] = s;
}
vector<string> ans;
for (int u = 0; u < N; ++u) {
if (deg[u] > 0 && sumNei[u] < 1LL * deg[u] * deg[u]) ans.push_back(names[u]);
}
sort(ans.begin(), ans.end());
if (ans.empty()) {
cout << "None\n";
} else {
for (int i = 0; i < (int)ans.size(); ++i) {
if (i) cout << ' ';
cout << ans[i];
}
cout << '\n';
}
return 0;
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
Map<String, Integer> id = new HashMap<>();
List<String> U = new ArrayList<>(), V = new ArrayList<>();
int idx = 0;
for (int i = 0; i < m; i++) {
String u = sc.next();
String v = sc.next();
U.add(u); V.add(v);
if (!id.containsKey(u)) id.put(u, idx++);
if (!id.containsKey(v)) id.put(v, idx++);
}
int N = idx;
List<Integer>[] g = new ArrayList[N];
for (int i = 0; i < N; i++) g[i] = new ArrayList<>();
int[] deg = new int[N];
String[] name = new String[N];
for (Map.Entry<String,Integer> e : id.entrySet()) name[e.getValue()] = e.getKey();
for (int i = 0; i < m; i++) {
int u = id.get(U.get(i));
int v = id.get(V.get(i));
g[u].add(v); g[v].add(u);
deg[u]++; deg[v]++;
}
long[] sumNei = new long[N];
for (int u = 0; u < N; u++) {
long s = 0;
for (int v : g[u]) s += deg[v];
sumNei[u] = s;
}
List<String> ans = new ArrayList<>();
for (int u = 0; u < N; u++) {
if (deg[u] > 0 && sumNei[u] < 1L * deg[u] * deg[u]) ans.add(name[u]);
}
if (ans.isEmpty()) {
System.out.println("None");
} else {
Collections.sort(ans);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < ans.size(); i++) {
if (i > 0) sb.append(' ');
sb.append(ans.get(i));
}
System.out.println(sb.toString());
}
}
}
n, m = map(int, input().split())
U, V = [], []
id_map = {}
idx = 0
for _ in range(m):
u, v = input().split()
U.append(u); V.append(v)
if u not in id_map:
id_map[u] = idx; idx += 1
if v not in id_map:
id_map[v] = idx; idx += 1
N = idx
g = [[] for _ in range(N)]
deg = [0] * N
names = [None] * N
for name, i in id_map.items():
names[i] = name
for i in range(m):
u = id_map[U[i]]; v = id_map[V[i]]
g[u].append(v); g[v].append(u)
deg[u] += 1; deg[v] += 1
sum_nei = [0] * N
for u in range(N):
s = 0
for v in g[u]:
s += deg[v]
sum_nei[u] = s
ans = [names[u] for u in range(N) if deg[u] > 0 and sum_nei[u] < deg[u] * deg[u]]
if not ans:
print('None')
else:
ans.sort()
print(' '.join(ans))
算法及复杂度
- 算法:建图、度数统计、邻居度数求和,判定
收集并排序姓名
- 时间复杂度:
- 空间复杂度: