CODE[VS]-1332

CODE[VS]-1332

基本上算是強;連通分量的板子題吧,只需要對最後的拓撲序稍微的操作一下就行了,

下面給出代碼。

#include<bits/stdc++.h>
using namespace std;
#define met(Q,QQ) memset(Q,QQ,sizeof(Q))
const int maxn=5007;
vector<int > G[maxn];
vector< int > rG[maxn];
vector< int > vec;
bool vis[maxn];
int cmp[maxn];
int n,m;
int a[maxn];
void add_edge(int from,int to)
{
    G[from].push_back(to);
    rG[to].push_back(from);
}

void dfs(int k)
{
    vis[k]=true;
    int kk=G[k].size();
    for(int i=0;i<kk;i++)
    {
        int kkk=G[k][i];
        if(!vis[kkk]) dfs(kkk);
    }
    vec.push_back(k);
}


void rdfs(int k,int cnt)
{
    vis[k]=true;
    cmp[k]=cnt;
    int kk=rG[k].size();
    for(int i=0;i<kk;i++)
    {
        int kkk=rG[k][i];
        if(!vis[kkk]) rdfs(kkk,cnt);
    }
}





int main()
{
    scanf("%d %d",&n,&m);
    int t,from,to;
    for(int i=1;i<=m;i++)
    {
        scanf("%d %d %d",&from,&to,&t);
        add_edge(from,to);
        if(t==2) add_edge(to,from);
    }
    met(vis,0);
    for(int i=1;i<=n;i++)
    {
        if(!vis[i]) dfs(i);
    }
    met(vis,0);
    int cnt=0;
    int kk=vec.size();
    for(int i=kk-1;i>=0;i--)
    {
        int kkk=vec[i];
        if(!vis[kkk])
        {
            cnt++;
            rdfs(kkk,cnt);
        }
    }
    met(a,0);
    for(int i=1;i<=n;i++)
    {
        a[cmp[i]]++;
    }
    int MAX=-1,B=0;
    for(int i=1;i<=cnt;i++)
    {
        if(a[i]>MAX)
        {
            MAX=a[i];
        }
    }
    printf("%d\n",MAX);
    int AA=0;
    for(int i=1;i<=n;i++)
    {
        if(a[cmp[i]]==MAX)
        {
            B=cmp[i];
        }
        if(cmp[i]==B)
        {
            if(AA)
            {
                printf(" %d",i);
            }
            else
            {
                printf("%d",i);
                AA=1;
            }
        }
    }
    return 0;
}






 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章