比赛 东方幻想乡 S1 评测结果 AAAAAAAAAA
题目名称 上白泽慧音 最终得分 100
用户昵称 Makazeu 运行时间 0.034 s
代码语言 C++ 内存使用 0.42 MiB
提交时间 2012-08-07 21:03:30
显示代码纯文本
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <stack>
#include <set>
#include <algorithm>
using namespace std;
const int MAXN=5555;
int Index=0,dfn[MAXN],low[MAXN];
bool InStack[MAXN];
int N,M; 
set<int> Ans,Res;
stack<int> Stack;
vector<int> map[MAXN]; 
 
inline void init()
{
    scanf("%d %d\n",&N,&M);
    int a,b,c;
    for(int i=1;i<=M;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        if(c==1) map[a].push_back(b);
        else map[a].push_back(b),
        map[b].push_back(a);
    }
}
 
inline int Min(int a,int b)
{
    return a<b?a:b;
}
 
inline bool check()
{
    set<int> :: iterator iter1=Ans.begin();
    set<int> :: iterator iter2=Res.begin();
    for(;iter1!=Ans.end();iter1++,iter2++)
    {
        if(*iter1!=*iter2)
            return *iter1>*iter2;
    }
    return 0;
}
 
void tarjan(int k)
{
    dfn[k]=low[k]=++Index,InStack[k]=1;
    Stack.push(k); int n;
    for(int i=0;i<map[k].size();i++)
    {
        n=map[k][i];
        if(!dfn[n])
        {
            tarjan(n);
            low[k]=Min(low[k],low[n]);
        }
        else if(InStack[n])
        low[k]=Min(low[k],dfn[n]);
    }
    if(dfn[k]==low[k])
    {
        Res.clear();
        do
        {
            n=Stack.top();
            Stack.pop();
            InStack[n]=0;
            Res.insert(n);  
        }while(k!=n);
        n=Res.size();
        if(n>Ans.size()) Ans=Res;
        else if(n==Ans.size())
        {
            if(check()) Ans=Res;
        }
    }
}
 
int main()
{
    freopen("classroom.in","r",stdin);
    freopen("classroom.out","w",stdout);
    init();
    for(int i=1;i<=N;i++)
        if(!dfn[i]) tarjan(i);
    printf("%d\n",Ans.size());
    set<int> :: iterator iter=Ans.begin();
    for(;iter!=Ans.end();iter++) 
        printf("%d ",*iter);    
    return 0;   
}