zoukankan      html  css  js  c++  java
  • Vijos P1325桐桐的糖果计划

    > P1325桐桐的糖果计划 标签:**图结构 强连通分量** 描述 桐桐很喜欢吃棒棒糖。他家处在一大堆糖果店的附近。 但是,他们家的区域经常出现塞车、塞人等情况,这导致他不得不等到塞的车或人走光了他才能去买到他最爱吃的棒棒糖品种。于是,他去找市长帮他修路,使得每两个糖果店之间至少有两条完全不同的路。可是市长经费有限,于是让桐桐找出哪些路被塞住后会使某些糖果店与糖果店间无法到达及最少的修路条数。你能帮助他吃到他最喜爱的糖果吗? 注: 1->3->2 和 1->3->4->2 为不完全不同的路,即不符合题意的路。 1->3->4->2 和 1->5->2 为完全不同的路,即符合题意的路。 格式 输入格式 输入第一行是两个数n,m(n《=5000,m《=10000) 接下来的m行,每行两个数i,j,表示i,j间有一条边连接。 输出格式 输出有两行。第一行为塞住后就不可以到达某些糖果店的道路条数,第二行为最少的修路条数。 样例1 样例输入1 7 7 1 2 2 3 3 4 2 5 4 5 5 6 5 7 样例输出1 3 2 限制 提示 1 2 3 +—+—+ | | | | 6 +—+—+ 4 / 5 / / 7 + 上图是样例所表示的一个图。 下图是改变后的图,其中虚线表示应连接的边。 1 2 3 +—+—+
    | |
    | |
    6 +—+—+ 4
    / 5 :
    / :
    / :
    7 + - - - -
    来源
    根据Pku原题改编
    本题目由VijosCP V0.1.1 测试版 生成 请勿删除此行
    /*
    tarjan求无向图的双连通分量.
    求'桥'的个数(即缩点后双连通分量个数-1)
    和叶节点的个数(缩点后统计出度为一的点).
    连边个数即(叶节点的个数+1)/2. 
    和有向图不同的是要判断自环.
    建双向边且重边不能删(显然会影响答案).
    判自环的时候因为我们建边是双向的.
    所以边的编号是相邻的.
    所以我们只需要把边的编号抑或一下就好了.
    eg:(1^1=2 1^2=1,3^1=4,4^1=3). 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define MAXN 20001
    using namespace std;
    int b[MAXN],dfn[MAXN],s[MAXN],out[MAXN],n,m,ans,sum,tot;
    int head[MAXN],low[MAXN],cut,stack[MAXN],top;
    bool in[MAXN];
    struct data{int v,next;}e[MAXN];
    int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')ch=getchar();}
        while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
        return x*f;
    }
    void add(int u,int v)
    {
        e[tot].v=v;
        e[tot].next=head[u];
        head[u]=tot++;
    }
    void tarjan(int u,int fa)
    {
        low[u]=dfn[u]=++cut;stack[++top]=u,in[u]=true;
        int v;
        for(int i=head[u];i!=-1;i=e[i].next)
        {
            v=e[i].v;
            if(i==(fa^1)) continue;
            if(!dfn[v])
            {
              tarjan(v,i);
              low[u]=min(low[v],low[u]);
            }
            else if(in[v])
              low[u]=min(dfn[v],low[u]);
        }
        if(dfn[u]==low[u])
        {
            tot++;
            do
            {
                v=stack[top--];
                in[v]=false;
                b[v]=tot;
            }while(u!=v);
        }
    }
    void slove()
    {
        tot=0;
        for(int i=1;i<=n;i++)
          if(!dfn[i])
            tarjan(i,-1);
        printf("%d
    ",tot-1);
        for(int i=1;i<=n;i++)
          for(int j=head[i];j!=-1;j=e[j].next)
          {
            if(b[i]!=b[e[j].v])
               out[b[i]]++;
          }
        for(int i=1;i<=tot;i++)
          if(out[i]==1) ans++;
        printf("%d",(ans+1)/2);
    }
    int main()
    {
        int x,y;
        memset(head,-1,sizeof(head));
        n=read();m=read();
        for(int i=1;i<=m;i++)
        {
            x=read();y=read();
            add(x,y),add(y,x);
        }
        slove();
        return 0;
    }
  • 相关阅读:
    Chandy-Lamport_algorithm
    3 differences between Savepoints and Checkpoints in Apache Flink
    列数 行数 表数 限制
    数据收集、传输、元数据管理、作业流调度、海量数据查询引擎、数据可视化
    分析云负载均衡产品
    端口被占用通过域名的处理 把www.domain.com均衡到本机不同的端口 反向代理 隐藏端口 Nginx做非80端口转发 搭建nginx反向代理用做内网域名转发 location 规则
    JSON Web Token
    查看开启端口的应用
    If the parts of an organization (e.g., teams, departments, or subdivisions) do not closely reflect the essential parts of the product, or if the relationship between organizations do not reflect the r
    微服务架构的理论基础
  • 原文地址:https://www.cnblogs.com/nancheng58/p/6070759.html
Copyright © 2011-2022 走看看