Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
这个代码在3177能过...为什么在这题就过不了呢#include <iostream> using namespace std; #define M 10005 #define N 5005 struct enode { int b,next; }; enode map[M]; struct vnode { int anc,deep,next; }; vnode v[N]; int n; int belongs[N]; //记录每个节点对应的标号... pair<int,int> bridges[N]; //记录所有桥... int ll; //记录桥的个数... int root[N]; //记录根节点.. int color[N]; //记录点的状态。==-1,则说明没被扫描,==0表示正在扫描.. ==1表示已经扫描完了... //因为出现圈的情况是扫描到color[]==0的点(其最高祖先节点比其父节点高..) void solve(); void dfs(int k,int father,int d); //k表示当前节点,father表示k的父亲节点,d表示当前节点的深度... //可以确定每个节点属于哪个集合...还有,哪些表示是桥...(并查集) int roots(int x); void unit(int x,int y); int main() { int m,l=0,i,x,y; scanf("%d %d",&n,&m); memset(v,-1,sizeof(v)); for(i=0;i<m;i++) { scanf("%d %d",&x,&y); map[l].b=y; map[l].next=v[x].next; v[x].next=l++; map[l].b=x; map[l].next=v[y].next; v[y].next=l++; } solve(); return 0; } void solve() { memset(color,-1,sizeof(color)); int i,ras=0; for(i=1;i<=n;i++) root[i]=i; dfs(1,1,1); memset(belongs,-1,sizeof(belongs)); for(i=1;i<=n;i++) { int d=roots(i); if(belongs[d]==-1) belongs[d]=++ras; belongs[i]=belongs[d]; } int dex[N],count=0; //记录每个点的度数... 记录度数为0的点的个数... memset(dex,0,sizeof(dex)); for(i=0;i<ll;i++) { int a=belongs[bridges[i].first],b=belongs[bridges[i].second]; dex[a]++; dex[b]++; } for(i=1;i<=ras;i++) if(dex[i]==1) count++; //*** printf("%d\n",(count+1)/2); } void dfs(int k,int father,int d) //确定双连通点的集合,找出桥... 返回子树中中的最高祖先... { v[k].deep=d; v[k].anc=d; color[k]=0; //cout<<k<<" "<<father<<" "<<d<<endl; for(int i=v[k].next;i!=-1;i=map[i].next) { int y=map[i].b; if(color[y]==-1) { dfs(y,k,d+1); if(v[k].anc>=v[y].anc) //(k,y)不是桥,则k,y必然属于同一个缩点... v[k].anc=v[y].anc,unit(k,y); else //反之,(k,y)是桥,记录桥... bridges[ll].first=k,bridges[ll++].second=y; } else if(color[y]==0&&y!=father) v[k].anc=v[y].deep; //??? } color[k]=1; } int roots(int x) { if(x!=root[x]) root[x]=roots(root[x]); return root[x]; } void unit(int x,int y) { int a=roots(x),b=roots(y); if(a!=b) root[a]=b; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator