设为首页 加入收藏

TOP

zoj2588 Burning Bridges --- 求割边
2015-07-24 05:45:23 来源: 作者: 【 】 浏览:4
Tags:zoj2588 Burning Bridges ---



#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include 
         
           #include 
           #define inf 0x3f3f3f3f #define eps 1e-6 #define ll __int64 using namespace std; #define N 10010 #define M 100010 struct node//边结点 { int v,tag,id;//v为所连接的另一个结点,tag为重边数,id为序号 node *next; }; int n,m;//点,边数 int nid;//输入时边的序号 node mem[M*2];int memp;//mem为存储边结点的数组,memp为mem数组序号 node *e[N];//邻接表 int brig[M];//brig[i]=1表示第i+1条边为割边 int nbrig;//求得割边的数目 int low[N],dfn[N];//low[i]为顶点i可达祖先的最小编号,dfn[i]为深度优先数 int vis[N];//0未访问 1已访问 2已访问且已检查邻接结点 //在邻接表中插入边(i,j),若有重边,则只把相应边结点的tag+1 int addedge(int i,int j) { node* p; for(p=e[i];p!=NULL;p=p->next) if(p->v==j) break; if(p!=NULL) { p->tag++; return 0; } p=&mem[memp++]; p->v=j; p->next=e[i]; e[i]=p; p->id=nid; p->tag=0; return 1; } //参数含义:i为当前搜索的顶点,father为i的父节点,dth为搜索深度 void dfs(int i,int father,int dth) { vis[i]=1; dfn[i]=low[i]=dth; node* p; for(p=e[i];p!=NULL;p=p->next) { int j=p->v; if(j!=father&&vis[j]) low[i]=min(low[i],dfn[j]); if(!vis[j]) { dfs(j,i,dth+1); low[i]=min(low[i],low[j]); if(low[j]>dfn[i]&&!p->tag) brig[p->id]=++nbrig; } } vis[i]=2; } void init() { memp=nid=nbrig=0; memset(e,0,sizeof e); memset(brig,0,sizeof brig); memset(vis,0,sizeof vis); } int main() { int t,i,j,a,b; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); init(); for(i=0;i
           
            

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇hdu 1071 The area 高斯消元求二.. 下一篇ajaxFileUpload+struts2实现多文..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: