P10942 GF和猫咪的玩具
题目描述
GF 同学和猫咪得到了一个特别的玩具,这个玩具由 nnn 个金属环(编号为 1∼n1 \sim n1∼n)和 mmm 条绳索组成,每条绳索连接两个不同的金属环,并且长度相同。GF 左手拿起金属环 LLL,猫咪右手(或者说:爪)拿起金属环 R (L≠R)R\ (L \ne R)R (L=R),然后尽量的向两边拉,他希望选择合适的 LLL 和 RRR,使得被拉紧的绳索尽量的多。
注:如果像样例那样 1→2→4→3→5→6→11 \to 2 \to 4 \to 3 \to 5 \to 6 \to 11→2→4→3→5→6→1 构成了一个环,我们认为拉 111 和 333 时只能拉紧一边(1→2→4→31 \to 2 \to 4 \to 31→2→4→3 或 3→5→6→13 \to 5 \to 6 \to 13→5→6→1)而不算全部拉紧。通俗地说,也就是当两个环之间有几个绳索数相等的连接方法时,只算其中一条连接方法拉紧,不算全部拉紧。
输入格式
第一行包含两个正整数 n,mn,mn,m(n≤100n \le 100n≤100);
接下来的 mmm 行包含两个正整数 a,ba,ba,b,表示有一条绳索连接了 aaa 和 bbb 的绳索。
输出格式
仅包含一个整数,表示最多能拉紧的绳索数。
输入输出样例 #1
输入 #1
6 6
1 2
1 6
2 4
6 5
4 3
5 3
输出 #1
3
C++实现
#include<bits/stdc++.h>
#define qwq for(int i=1;i<=n;i++){bj[i]=0;}
struct Node{
int p,w;
};
using namespace std;
int ans=0;
bool bj[101];
vector<int>a[101];
queue<Node>q;
void bfs(int p,int w){
ans=max(ans,w);//更新答案
bj[p]=1;
for(auto it:a[p]){
if(!bj[it]){
q.push({it,w+1});
bj[it]=1;
}
}
}
signed main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
a[u].push_back(v);
a[v].push_back(u);//存无向图
}
for(int i=1;i<=n;i++){
q.push({i,0});
while(!q.empty()){
bfs(q.front().p,q.front().w);//bfs
q.pop();
}
qwq;//记得清空标记数组
}
printf("%d",ans);
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++实现信奥 P10942 GF和猫咪的玩具&spm=1001.2101.3001.5002&articleId=151392808&d=1&t=3&u=10182c308d724b64a74edcc461dd3747)
1002

被折叠的 条评论
为什么被折叠?



