比赛 |
东方幻想乡 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;
}