PKU 3687 Labeling Balls

#include<iostream>
#include
<vector>
using namespace std;

vector
<int>adj[5100];
int mark[5100];
int low[5100];
int sstack[5100],stop;
int dfn;
int ans=0;
int bcc[5100],bid;
int degree[5100];

int dfs(int k,int p)
{
    
int i,j;
    low[k]
=mark[k]=dfn++;
    sstack[stop
++]=k;
    
for(i=0;i<adj[k].size();++i)
    {
        j
=adj[k][i];
        
if(mark[j]==0)
        {
            dfs(j,k);
            low[k]
=min(low[k],low[j]);
        }
        
else if(j!=p)
            low[k]
=min(low[k],mark[j]);
    }
    
if(mark[k]>low[k])
        
return 0;
    
while(sstack[--stop]!=k)
        bcc[sstack[stop]]
=bid;
    bcc[k]
=bid;
    
++bid;
    
return 0;
}

bool check(int i,int j)
{
    
int k;
    
for(k=0;k<adj[i].size();++k)
        
if(adj[i][k]==j)return false;
    
return true;
}

int main()
{
    
int i,j,k;
    
int n,m;
    scanf(
"%d%d",&n,&m);
    
for(k=0;k<m;++k)
    {
        scanf(
"%d%d",&i,&j);
        
if(check(i,j))
        {
            adj[i].push_back(j);
            adj[j].push_back(i);
        }
    }
    dfn
=1;
    bid
=1;
    stop
=0;
    memset(mark,
0,sizeof(mark));
    memset(degree,
0,sizeof(degree));
    dfs(
1,-1);
    ans
=0;
    
for(i=1;i<=n;++i)
        
for(j=0;j<adj[i].size();++j)
            
if(bcc[i]!=bcc[adj[i][j]])
                
++degree[bcc[i]];
    
for(i=1;i<=bid;++i)
        
if(degree[i]==1)
            
++ans;
    printf(
"%d\n",(ans+1)/2);
    
return 0;
}
posted @ 2009-03-27 23:04  unber  阅读(251)  评论(0编辑  收藏  举报