| ||||||||||
| 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