int main() { printf("欢迎使用烽火戏诸侯系统:\n"); printf("请依次输入诸侯及国王的总数量、诸侯-诸侯及国王-诸侯间的路径总数量 (两个数字用空格隔开):\n"); scanf("%d%d",&n,&m); int a,b;//边所连接的两个顶点 init(n); printf("请依次输入存在连通路径的两个诸侯或国王标号,(默认国王为标号1):\n"); for(int i=1;i<=m;i++) { scanf("%d%d",&a,&b); t[a].push_back(b); t[b].push_back(a); merge(a,b); } printf("最少所需的点火次数为:%d",block(n)); return 0; }改c++
时间: 2023-06-19 12:02:48 浏览: 233
Linux:printk与printf的区别
5星 · 资源好评率100%
#include <iostream>
#include <vector>
using namespace std;
int n, m;
vector<int> t[10001];
int fa[10001];
void init(int n) {
for (int i = 1; i <= n; i++) {
fa[i] = i;
}
}
int find(int x) {
if (x == fa[x]) {
return x;
}
return fa[x] = find(fa[x]);
}
void merge(int a, int b) {
int faA = find(a);
int faB = find(b);
if (faA != faB) {
fa[faA] = faB;
}
}
int block(int n) {
int cnt = 0;
for (int i = 1; i <= n; i++) {
if (fa[i] == i) {
cnt++;
}
}
return cnt;
}
int main() {
cout << "欢迎使用烽火戏诸侯系统:\n";
cout << "请依次输入诸侯及国王的总数量、诸侯-诸侯及国王-诸侯间的路径总数量 (两个数字用空格隔开):\n";
cin >> n >> m;
int a, b;//边所连接的两个顶点
init(n);
cout << "请依次输入存在连通路径的两个诸侯或国王标号,(默认国王为标号1):\n";
for (int i = 1; i <= m; i++) {
cin >> a >> b;
t[a].push_back(b);
t[b].push_back(a);
merge(a, b);
}
cout << "最少所需的点火次数为:" << block(n) << endl;
return 0;
}
阅读全文