zoukankan      html  css  js  c++  java
  • 【STL】完美网络(优先队列实现)

    完美网络 

    Time Limit: 1000MS Memory limit: 65536K

    题目描述

    完美网络是连通网络的基础上要求去掉网络上任意一条线路,网络仍然是连通网络。求一个连通网络要至少增加多少条边可以成为完美网络。

    输入

    第一行输入一个数T代表测试数据个数(T<=20)。每个测试数据第一行2个数n,m 分别代表网络基站数和基站间线路数。基站的序号为从1到n。接下来m行两个数代表x,y 代表基站x,y间有一条线路。
    (0

    输出

    对于每个样例输出最少增加多少线路可以成为完美网络。每行输出一个结果。

    示例输入

    2
    3 1
    1 2
    3 2
    1 2
    2 3

    示例输出

    2
    1 

    完美网络,只有图中每个点的度>=2,此时才能保证任意删去一条边,图还是联通。
     1 #include<iostream>
     2 #include<algorithm>
     3 #include<stdio.h>
     4 #include<string.h>
     5 #include<queue>
     6 using namespace std;
     7 
     8 int n,m;
     9 int dg[10000100];//点的度
    10 int main()
    11 {
    12     int T;
    13     scanf("%d",&T);
    14     while(T--)
    15     {
    16         priority_queue<int, vector<int>, greater<int> >que;//定义优先队列
    17         memset(dg,0,sizeof(dg));
    18         scanf("%d %d", &n,&m);
    19         int x,y;
    20         for(int i=0;i<m;i++)
    21         {
    22             scanf("%d%d",&x,&y);
    23             dg[x-1]++;//输入一条边,同时使两顶点度加1
    24             dg[y-1]++;
    25         }
    26         sort(dg,dg+n);//排序,从小到大
    27 
    28         for(int i=0;i<n;i++)
    29         {
    30             if(dg[i]<2)//把度小于2的点压入优先队列
    31                 que.push(dg[i]);
    32         }
    33         int cnt = 0;//需要加的边数
    34         while(que.size()>=2)
    35         {
    36             int t = 0,f = 0;
    37             t = que.top();
    38             que.pop();
    39 
    40             f = que.top();
    41             que.pop();
    42 
    43             ++t;//取出栈顶的两个元素,度分别加1,
    44             ++f;
    45             cnt++;//这样相当于加了一条边
    46             if(t<2)//如果度加完后还是小于2,则下回优先考虑。
    47                 que.push(t);             //放入优先队列
    48             if(f<2)
    49                 que.push(f);
    50         }
    51         if(!que.empty())//如果执行完上述while循环后,队列还不为空
    52         {               //则这种情况只能说明,队列里还剩下一个元素,他的度仍小于2.
    53             cnt = cnt + 1;
    54         }
    55         printf("%d
    ", cnt);
    56     }
    57     return 0;
    58 }
  • 相关阅读:
    分形之城
    【SDOI2011 第2轮 DAY1】消防 树上问题+二分+贪心
    【Usaco Nov08 Gold】玩具 三分+贪心
    分治 复习
    快读板子
    最小线段覆盖 C神奇项链
    比赛经验积累1
    字符串 专题
    界面小项目之W3C
    前端小基础
  • 原文地址:https://www.cnblogs.com/6bing/p/4123698.html
Copyright © 2011-2022 走看看