把代码:#include<bits/stdc++.h> using namespace std; const int N=1005; int n,m; vector<int> t[N]; int pre[N],root[N];//地图类 class king{ int id=1;//国王的标号默认为1 }; class seigneur{ int id;//该候王的标号 }; class file{ int edge;//点了火表示有连通关系 }; void init(int nn) { for(int i=1;i<=nn;i++) pre[i]=i; } int find(int x) { int f=x; while(x!=pre[x])//找到x的父节点 x=pre[x]; int j; while(f!=pre[f])//依次将x上面的节点的父节点赋为x; { j=f; f= pre[f]; pre[j]=x; } return x; } void merge(int a,int b) { int t1,t2; t1=find(a); t2=find(b); if(t1!=t2) { pre[t2]=t1; } } int block(int nn) { int ans=0; for(int i=1;i<=nn;i++) root[pre[i]]=1; for(int i=1;i<=nn;i++) ans+=root[i]; return ans; } 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 16:03:05 浏览: 107
#include <iostream>
#include <vector>
using namespace std;
const int N = 1005;
int n, m;
vector<int> t[N];
int pre[N], root[N];
class King {
int id = 1;
};
class Seigneur {
int id;
};
class File {
int edge;
};
void init(int nn) {
for (int i = 1; i <= nn; i++)
pre[i] = i;
}
int find(int x) {
int f = x;
while (x != pre[x])
x = pre[x];
int j;
while (f != pre[f]) {
j = f;
f = pre[f];
pre[j] = x;
}
return x;
}
void merge(int a, int b) {
int t1, t2;
t1 = find(a);
t2 = find(b);
if (t1 != t2) {
pre[t2] = t1;
}
}
int block(int nn) {
int ans = 0;
for (int i = 1; i <= nn; i++)
root[pre[i]] = 1;
for (int i = 1; i <= nn; i++)
ans += root[i];
return ans;
}
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;
}
阅读全文