zoukankan      html  css  js  c++  java
  • 危险系数 set容器

    题目描述

    抗日战争时期,冀中平原的地道战曾发挥重要作用。
    地道的多个站点间有通道连接,形成了庞大的网络。但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系。
    我们来定义一个危险系数DF(x,y):
    对于两个站点x和y (x != y), 如果能找到一个站点z,当z被敌人破坏后,x和y不连通,那么我们称z为关于x,y的关键点。相应的,对于任意一对站点x和y,危险系数DF(x,y)就表示为这两点之间的关键点个数。

    本题的任务是:已知网络结构,求两站点之间的危险系数。

    输入格式

    输入数据第一行包含2个整数n(2 <= n <= 1000), m(0 <= m <= 2000),分别代表站点数,通道数;
    接下来m行,每行两个整数 u,v (1 <= u, v <= n; u != v)代表一条通道;
    最后1行,两个数u,v,代表询问两点之间的危险系数DF(u, v)。

    输出

    一个整数,如果询问的两点不连通则输出-1.

    样例输入

    7 6
    1 3
    2 3
    3 4
    3 5
    4 5
    5 6
    1 6

    样例输出

    2

    写了一个中午,最后还是选了set容器,因为他不能存放相同的元素:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<set>
    #include<vector>
    #include<queue>
    using namespace std;
    const int N=1010;
    int vis[N];
    int ai,bi;
    vector< int >G[N];
    int dfs(int x)
    {
        int i,now,end;
        set< int >q;             //  set  容器的引入 是为了防止里面的重复元素;
       for(i=0;i<G[x].size();i++)//放入,与第一个元素相连通的所有的元素;
       {
           if(vis[G[x][i]]!=1)
           q.insert(G[x][i]);
       }
       while(!q.empty())
       {
           now=*q.begin();
           if(now==bi)
              return 1;
            vis[*q.begin()]=1;//标记引导元素
            q.erase(*q.begin());//删去容器中的元素//已经被标记了,不可能再次进入
           for(i=0; i<G[now].size(); i++)
                {
                    if(vis[G[now][i]]==0)
                    {
                        q.insert(G[now][i]);
                    }
                }
       }
        return 0;
    }
    int main()
    {
        int i,j,k,t,m,n,count=0,a,b;
        cin>>m>>n;
        for(i=0;i<n;i++)
        {
            cin>>a>>b;
            G[a].push_back(b);
            G[b].push_back(a);
        }
        cin>>ai>>bi;
        for(i=1;i<=m;i++)
            if(i!=ai  && i!=bi)//设置点,如果去掉这个店,看看能不能连通;不能连通的为关键点
            {
                memset(vis,0,sizeof(vis));
                vis[i]=1;vis[ai]=1;
                if(dfs(ai)==0)
                {
                   count ++;
                }
                vis[i]=0;
            }
            if(count>0)
             cout<<count<<endl;
               else cout<<"-1"<<endl;
        return 0;
    }
  • 相关阅读:
    怎样提高js的编程能力
    如何提升自己
    利用nginx做反向代理解决前端跨域问题
    vue项目中使用组件化开发
    vue中refs的使用
    vue项目使用keep-alive的作用
    hadoop安装、使用过程的异常汇总
    CSS选择器优先级总结
    为什么CSS选择器是从右往左解析
    MySql中游标的定义与使用方式
  • 原文地址:https://www.cnblogs.com/lovychen/p/3611252.html
Copyright © 2011-2022 走看看