思路:既然要找环,那必然有单独存在的电脑,即该电脑只与一台电脑相连,开一个vector<ll>rel[N]作为记录电脑之间的关系表,然后再开一个ListContact[N] 记录每个电脑分别与多少电脑相连,从起点出发,删掉ListContact[N]==1的点,然后循环,直到删完了所有ListContact[N]==1的点,剩余的点就是环中的一部分了,按顺序输出即可。tips:N一定要开大点,不然只能过部分,当时写的时候一直在纠结哪写错了,到最后发现数组开小了
C++代码:
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
const ll N=100010;//N要开大,不然只能过30%左右/(ㄒoㄒ)/~~
vector<ll>rel[N];//电脑之间联系表
ll n;
ll ListContact[N];//记录每个节点与几个节点相连,删除只有一个点相连的,剩下的就构成环了
void solve(){
for(int i=1;i<=n;i++){
if(ListContact[i]==1){
int temp=i;
while(ListContact[temp]==1){//沿着删除的节点一直下去,直到遇到与两个点相连的
int temp2=rel[temp][0];//因为只有一个点相连,所以肯定是rel[temp][0]
ListContact[temp2]--;
temp=temp2;//若仍只有一个,继续删
}
}
}
}
int main()
{
// 请在此输入您的代码
cin>>n;
int a,b;
for(ll i=1;i<=n;i++){
cin>>a>>b;
rel[a].push_back(b);
rel[b].push_back(a);
ListContact[a]++;
ListContact[b]++;
}
solve();
for(int i=1;i<=n;i++){//按顺序输出即可
if(ListContact[i]>1){
cout<<i<<' ';
}
}
return 0;
}
希望对有需要的人能有所帮助,欢迎大家有什么问题到评论区里一起讨论!