标签:
★★ 输入文件:gd.in
输出文件:gd.out
简单对比
时间限制:1 s 内存限制:128 MB
输入文件名: gd.in
7
1 2
2 3
2 4
3 4
4 5
4 6
4 7
5 6
6 7
输出文件名:gd.out
2
2
4
————————————————————我是分割线————————————————————————
targan算法模改,求割点。
模板题。
p.s.这个OJ上竟然必须打输入输出,否则爆零。(真是滑稽)
1 /*COGS 08 2 by S.B.S.*/ 3 #include<iostream> 4 #include<cstdio> 5 #include<cstring> 6 #include<cmath> 7 #include<algorithm> 8 #include<queue> 9 #include<cstdlib> 10 #include<iomanip> 11 #include<cassert> 12 #include<climits> 13 #define maxn 121 14 #define inf 0x7fffffff 15 #define F(i,j,k) for(int i=j;i<=k;i++) 16 #define FF(i,j,k) for(int i=j;i>=k;i--) 17 #define M(a,b) memset(a,b,sizeof(b)) 18 using namespace std; 19 int read(){ 20 int x=0,f=1;char ch=getchar(); 21 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} 22 while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} 23 return x*f; 24 } 25 vector<int> edge[maxn]; 26 int n,m,dfn[maxn],low[maxn]; 27 int cnt,tim=0,cut; 28 int root; 29 int ans=0; 30 inline void addedge(int u,int v) 31 { 32 edge[u].push_back(v); 33 edge[v].push_back(u); 34 } 35 bool gd[maxn]; 36 inline void dfs(int u) 37 { 38 low[u]=dfn[u]=++tim; 39 int v;int tot=0; 40 F(i,0,edge[u].size()-1) 41 { 42 v=edge[u][i]; 43 if(!dfn[v]){ 44 dfs(v); 45 tot++; 46 low[u]=min(low[v],low[u]); 47 if((u==root&&tot>1)||(u!=root&&low[v]>=dfn[u])) 48 if(!gd[u]) 49 { 50 gd[u]=true; 51 ans++; 52 } 53 } 54 else 55 low[u]=min(low[u],dfn[v]); 56 } 57 } 58 int main() 59 { 60 std::ios::sync_with_stdio(false); 61 freopen("gd.in","r",stdin); 62 freopen("gd.out","w",stdout); 63 int n,m; 64 cin>>n;int x,y; 65 while(cin>>x>>y) 66 { 67 addedge(x,y); 68 } 69 F(i,1,n) 70 { 71 if(!dfn[i]) 72 { 73 root=i; 74 dfs(i); 75 } 76 } 77 cout<<ans<<endl; 78 F(i,1,n){ 79 if(gd[i]) cout<<i<<endl; 80 } 81 return 0; 82 }
标签:
原文地址:http://www.cnblogs.com/SBSOI/p/5613874.html