vector结合pair形式
用vector结合pair直接统计每个节点的出度和入度 (指向其他节点次数和被其他节点指向次数)
出度为0的为叶 入度为1的为根(只输出第一个)
#include <bits/stdc++.h>
using namespace std;
int main(){
int a;
cin>>a;
int aa=a-1;
vector<pair<int,int>> cc(a+1,{0,0});//出度,入度
while(aa--){
int b,c;
cin>>b>>c;
cc[b].first++;//出度(指向个数)
cc[c].second++;//入度(被指向个数)
}
vector<int> dd;//叶
int cnt=0;
for(int i=1;i<a+1;i++){
if(cc[i].first==0){
dd.push_back(i);
}
if(cc[i].second==0 && cnt == 0){
cout<<i<<'\n';
cnt++;
}
}
sort(dd.begin(),dd.end());
int ds=dd.size();
for(int i=0;i<ds;i++){
cout<<dd[i]<<" ";
}
}
二维map形式
#include <bits/stdc++.h>
using namespace std;
int main() {
int a;
cin >> a;
int aa = a - 1;
map<int, map<string, int>> cc; //编号 出度 入度
// 初始化出度、入度为0
for (int i = 1; i <= a; ++i) {
cc[i]["out"] = 0; //出度
cc[i]["in"] = 0; //入度
}
while (aa--) {
int b, c;
cin >> b >> c;
cc[b]["out"]++;
cc[c]["in"]++;
}
vector<int> dd; //叶
int cnt = 0;
// 遍历外层map
for (auto& i : cc) {
if ( i.second["out"] == 0) {
dd.push_back(i.first);
}
if (i.second["in"] == 0 && cnt == 0) {
cout << i.first << '\n';
cnt++;
}
}
// 叶
sort(dd.begin(), dd.end());
int ds = dd.size();
for (int i = 0; i < ds; ++i) {
cout << dd[i] << " ";
}
return 0;
}
速度优化(2ms)
用静态数组代替STL,用scanf和printf代替cin和cout,去掉sort ,cstdio换成stdio.h
#include <stdio.h>
const int MAX = 1e5 + 1;
int ot[MAX]={0},in[MAX]={0}, dd[MAX]; // 出度 入度 叶
int main() {
int a;
scanf("%d", &a);
int aa = a - 1;
for (int i = 0; i < aa; ++i) {
int b, c;
scanf("%d%d", &b, &c);
ot[b]++;
in[c]++;
}
int d=-1,ddd = 0;
for (int j = 1; j <= a; ++j) {
if (in[j] == 0 && d == -1) {
d = j;
printf("%d\n", d);
}
if (ot[j] == 0) {
dd[ddd++] = j;
}
}
for (int k = 0; k < ddd; ++k) {
printf("%d ", dd[k]);
}
return 0;
}

京公网安备 11010502036488号