正题
第二题:上白泽慧音
这道题就是裸裸的Tarjan强联通咯~
我们找出每个环,判断一下每个环的大小。排一下序输出即可。
代码<模板要背熟>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<stack>
#include<algorithm>
using namespace std;
int n,m;
struct edge{
int y,next;
}s[200010];
int first[10010];
int len=0;
int mmax,maxi;
vector<int> T[10010];
int tot=0;
struct node{
int dfn,low;
}op[10010];
stack<int> f;
int now=0;
bool tf[10010];
bool we[10010];
void ins(int x,int y){
len++;
s[len].y=y;s[len].next=first[x];first[x]=len;
}
void Tarjan(int x){
we[x]=true;
op[x].dfn=op[x].low=++now;
tf[x]=true;f.push(x);
for(int i=first[x];i!=0;i=s[i].next){
int y=s[i].y;
if(op[y].dfn==0){
Tarjan(y);
if(op[y].low<op[x].low) op[x].low=op[y].low;
}
else if(tf[y]==true)if(op[y].dfn<op[x].low) op[x].low=op[y].dfn;
}
if(op[x].dfn==op[x].low){
tot++;
while(1){
int k=f.top();
f.pop();
T[tot].push_back(k);
tf[k]=false;
if(k==x) break;
}
sort(T[tot].begin(),T[tot].end());
if(T[tot].size()>mmax){
mmax=T[tot].size();
maxi=tot;
}
else if(T[tot].size()==mmax && T[tot][0]<T[maxi][0]){
mmax=T[tot].size();
maxi=tot;
}
}
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++){
int x,y,c;
scanf("%d %d %d",&x,&y,&c);
if(c==2) ins(x,y),ins(y,x);
else ins(x,y);
}
int tt=0;
for(int i=1;i<=n;i++)
if(we[i]==false) Tarjan(i);
printf("%d\n",mmax);
for(int i=0;i<mmax;i++)
printf("%d ",T[maxi][i]);
}