记录编号 |
464064 |
评测结果 |
AAAAA |
题目名称 |
[福州培训2010] 轰炸 |
最终得分 |
100 |
用户昵称 |
BaDBoY |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.000 s |
提交时间 |
2017-10-25 06:33:15 |
内存使用 |
0.00 MiB |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
#define N 155
int n,m,low[N],dfn[N],tim,Fa[N],cnt;
vector<int> G[N];
void tarjan(int x,int f) {
Fa[x]=f;
dfn[x]=low[x]=++tim;
for(int i=0; i<G[x].size(); ++i) {
int k=G[x][i];
if(dfn[k]==-1) {tarjan(k,x); low[x]=min(low[x],low[k]);}
else if(f!=k) low[x]=min(low[x],dfn[k]);
}
}
struct EDGE {
int a,b;
friend bool operator < (EDGE x,EDGE y) {
return x.a==y.a?x.b<y.b:x.a<y.a;
}
} Edge[5005];
void count() {
tarjan(1,0);
for(int i=1; i<=n; ++i) {
int v=Fa[i];
if(v>0&&low[i]>dfn[v]) {
int ji=i;
if(ji>v) swap(ji,v);
Edge[++cnt].a=ji,Edge[cnt].b=v;
}
} sort(Edge+1,Edge+cnt+1);
for(int i=1; i<=cnt; ++i) printf("%d %d\n",Edge[i].a,Edge[i].b);
}
int Main() {
freopen("danger.in","r",stdin);
freopen("danger.out","w",stdout);
scanf("%d%d",&n,&m);
memset(dfn,0xff,sizeof(dfn));
for(int x,y,i=1; i<=m; ++i) {
scanf("%d%d",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
} count();
return 0;
}
int hehe=Main();
int main(){;}
/*
6 6
1 2
2 3
2 4
3 5
4 5
5 6
*/