记录编号 |
333689 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[顾研NOIP] 旅游电车 |
最终得分 |
100 |
用户昵称 |
Rapiz |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.894 s |
提交时间 |
2016-10-31 09:39:49 |
内存使用 |
24.93 MiB |
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stack>
#define file(x) "buss."#x
using std::min;
using std::max;
const int MAXE=50010,MAXV=5010;
int n,m,sz,hed[MAXV],nxt[MAXE],scnt,dfsclk,dfn[MAXV],scid[MAXV];
bool be[MAXV][MAXV];
std::vector<int> scom[MAXV],ans;
struct EDGE{int u,v;}st[MAXE];
void add(int u,int v){
st[++sz].u=u,st[sz].v=v;
nxt[sz]=hed[u],hed[u]=sz;
}
std::stack<int> sk;
int dfs(int u){
sk.push(u);
int lowu=dfn[u]=++dfsclk,v;
for(int e=hed[u];e;e=nxt[e]) {
if(!dfn[v=st[e].v]) lowu=min(lowu,dfs(v));
else if(!scid[v]) lowu=min(lowu,dfn[v]);
}
if(dfn[u]==lowu){
int x;
++scnt;
do{
x=sk.top();sk.pop();
scid[x]=scnt;
scom[scnt].push_back(x);
}while(x!=u);
}
return lowu;
}
int main(){
freopen(file(in),"r",stdin);
freopen(file(out),"w",stdout);
while(scanf("%d%d",&n,&m)==2){
for(int i=1;i<=scnt;i++) scom[i].clear();
sz=scnt=dfsclk=0;
memset(dfn,0,sizeof(dfn));
memset(scid,0,sizeof(scid));
memset(hed,0,sizeof(hed));
memset(be,0,sizeof(be));
ans.clear();
for(int i=1;i<=m;i++) {
int u,v;scanf("%d%d",&u,&v);
add(u,v);
}
for(int i=1;i<=n;i++) if(!dfn[i]) dfs(i);
for(int i=1;i<=sz;i++){
int u=scid[st[i].u],v=scid[st[i].v];
if(u!=v) be[u][v]=1;
}
for(int i=1;i<=scnt;i++){
bool f=0;
for(int j=1;j<=scnt;j++) if(be[i][j]){
f=1;
break;
}
if(!f)
for(int j=0;j<scom[i].size();j++) ans.push_back(scom[i][j]);
}
std::sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++) printf("%d ",ans[i]);
printf("\n");
}
}