您的位置:首页 > 其它

洛谷1726

2018-03-09 11:19 106 查看
小伙子,不会了,就回来看看。。。
这是蒟蒻第一次写tarjan,刚开始有一些点子没有考虑到,所以本篇就作为板子来打啦!!!
#include<vector>
#include<cstdio>
#include<cctype>
#include<stack>
using namespace std;
vector<int>a[5004];
stack<int>q;
int dfn[5004],b[5004],low[5004],col[5004],whic[5004],num,ans;
//读优比较弱,大神们有何高见?
inline int read(){
char ch=getchar();int k=0;
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)){k=(k<<3)+(k<<1)+ch-'0';ch=getchar();}
return k;
}

int minn(int a,int b){return a<=b?a:b;}

void tarjan(int x){
dfn[x]=low[x]=++num;b[x]=1;q.push(x);
for(int i=1;i<=a[x][0];i++){
int temp=a[x][i];
if(!dfn[temp]) {tarjan(temp);low[x]=minn(low[x],low[temp]);}//若temp未被访问过,则访问下去
else if(b[temp])low[x]=minn(low[x],low[temp]);//即temp点不在其他强连通分量里
}
if(dfn[x]==low[x]){
b[x]=0;whic[x]=++col[0];col[col[0]]++;
while(q.top()!=x){
int temp=q.top();
b[temp]=0;whic[temp]=col[0];col[col[0]]++;
q.pop();
}
q.pop();
if(col[col[0]]>ans) ans=col[col[0]];
}
}

int main(){
int n=read(),m=read();
for(int i=1;i<=n;i++) a[i].push_back(0);
for(int i=1;i<=m;i++){
int x=read(),y=read(),z=read();
a[x][0]++;a[x].push_back(y);
if(z==2){a[y][0]++;a[y].push_back(x);}
}
for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
printf("%d\n",ans);
for(int i=1;i<=n;i++) if(col[whic[i]]==ans) printf("%d ",i);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tarjan