zoukankan      html  css  js  c++  java
  • loj10098 分离的路径

    传送门

    分析

    此题要先用tarjan求点双联通分量,注意在求解是要注意一条无向边只能走一次。求完之后我们发现原来的图会变成一棵树,对于 这棵树我们发现答案是(叶子节点数量+1)/2,实际便是每两个节点之间连一条边。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<ctime>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    using namespace std;
    int dfn[11000],low[11000],ist[11000],cnt,sum,belong[11000],id[11000],ans;
    vector<int>v[11000];
    vector<int>nv[11000];
    stack<int>a;
    inline void tarjan(int x,int fa){
          dfn[x]=low[x]=++cnt;
          a.push(x);
          ist[x]=1;
          int wh=0;
          for(int i=0;i<v[x].size();i++){
                if(v[x][i]==fa&&!wh){
                  wh=1;
                  continue;
                }
              if(!dfn[v[x][i]]){
                tarjan(v[x][i],x);
                low[x]=min(low[x],low[v[x][i]]);
              }else if(ist[v[x][i]]){
                low[x]=min(low[x],dfn[v[x][i]]);
              }
            }
          if(dfn[x]==low[x]){
              sum++;
              while(1){
                int u=a.top();
                a.pop();
                ist[u]=0;
                belong[u]=sum;
                if(u==x)break;
              }
          }
          return;
    }
    int main(){
          int n,m,i,j,k,x,y;
          scanf("%d%d",&n,&m);
          for(i=1;i<=m;i++){
              scanf("%d%d",&x,&y);
              v[x].push_back(y);
              v[y].push_back(x);
          }
          tarjan(1,0);
          for(i=1;i<=n;i++)
            for(j=0;j<v[i].size();j++)
              if(belong[i]!=belong[v[i][j]])
                id[belong[v[i][j]]]++;
          for(i=1;i<=sum;i++)
            if(id[i]==1)ans++;
          printf("%d
    ",(ans+1)/2);
          return 0;
    }
  • 相关阅读:
    linux中断处理浅析
    linux页面回收浅析
    linux线程同步浅析
    剖析一个由sendfile引发的linux内核BUG
    比memcpy更快的内存拷贝
    linux内核SMP负载均衡浅析
    sscanf,snprintf
    mysql中实现longblob数据流式读写
    sscanf
    substr复制字符串的一部分
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/9522031.html
Copyright © 2011-2022 走看看