• TOJ 3046: 招商银行网络系统


    3046: 招商银行网络系统 分享至QQ空间

    Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByte
    Total Submit: 12            Accepted:3

    Description

    虽然招商银行的网络安全已经做得非常完善,但是天有不测风云,招商银行内部网络系统的一台服务器意外感染了一种新型病毒。为了避免更大的损失,管理员必须采取紧急措施遏制病毒的蔓延。
    招商银行内部网络系统共有n台服务器,这n台服务器使用m条电缆互相连接。为了描述方便,我们给服务器编号1到n。初始时,1号服务器感染了病毒。每隔一分钟,病毒便会从已感染病毒的服务器扩散到所有与之直接相连的服务器上。
    招商银行的网络系统设计得非常坚固,即使要切断电缆也非常困难。管理员只能在初始时切断一根电缆。为了让整个网络系统尽可能晚地全部被病毒感染,他应该切断哪根电缆?

    Input

    输入包含多组数据。
    每组数据的第一行是两个整数n和m (2≤n≤200, 1≤m≤n*(n-1)/2),其含义如上面所描述。
    接下来m行每行两个整数a, b (1≤a, b≤n),表示服务器a和服务器b有电缆直接连接。任意两台服务器间至多有一根电缆相连。
    输入数据以n=m=0结束。

    Output

    对每组数据输出最晚多少分钟之后整个网络系统被感染。如果切断某根电缆后病毒永远不会传播到某些服务器,那么输出”Great”。

    Sample Input

    4 5
    1 2
    2 3
    3 4
    4 1
    1 3
    4 4
    1 2
    2 3
    3 4
    1 3
    0 0

    Sample Output

    2
    Great

    可以想到其实就是到1的最短路

    可以想到m*m的,但是肯定会超时的啊。不过影响bfs其实就是bfs树上的路径,去枚举这些路径就是n*m的复杂度了

    #include <bits/stdc++.h>
    using namespace std;
    #define fi first
    #define se second
    const int N=205;
    vector<int>G[N];
    vector<pair<int,int>>E;
    int vis[N],n,cnt,ans;
    void bfs(int s,int t)
    {
        memset(vis,0,sizeof vis),cnt=0;
        queue<pair<int,int>>Q;
        Q.push({1,0}),vis[1]=1;
        while(!Q.empty())
        {
            pair<int,int> x=Q.front();
            Q.pop(),ans=max(ans,x.se),cnt++;
            for(auto X:G[x.fi])
            if(!vis[X]&&(!(X==s&&x.fi==t||X==t&&x.fi==s)))Q.push({X,x.se+1}),vis[X]=1;
        }
    }
    void la()
    {
        for(int i=0; i<n-1; i++)
        {
            bfs(E[i].fi,E[i].se);
            if(cnt<n)
            {
                cout<<"Great
    ";
                return;
            }
        }
        cout<<ans<<"
    ";
    }
    int main()
    {
        int m,x;
        while(cin>>n>>m,n||m)
        {
            ans=0,E.clear(),memset(vis,0,sizeof vis);
            for(int i=0,u,v; i<m; i++)cin>>u>>v,G[u].push_back(v),G[v].push_back(u);
            queue<int>Q;
            Q.push(1),vis[1]=1;
            while(!Q.empty())
            {
                x=Q.front(),Q.pop();
                for(auto X:G[x])if(!vis[X])Q.push(X),E.push_back({x,X}),vis[X]=1;
            }
            la();
            for(int i=1; i<=n; i++)G[i].clear();
        }
    }

     

  • 相关阅读:
    【裸机装系统】获取硬盘信息失败,请谨慎操作!
    【ORACLE】Win2008R2修改oracle数据库实例名
    【ORACLE】数据库空闲1分钟自动断开
    【ORACLE】oracle数据库用户密码复杂度配置
    【ORACLE】重写控制文件
    【ORACLE】oracle11g单实例安装
    【ORACLE】oracle打补丁
    【ORACLE】oracle11g dg搭建
    【ORACLE】oracle11g RAC搭建
    nginx负载均衡简单示例
  • 原文地址:https://www.cnblogs.com/BobHuang/p/10590853.html
Copyright © 2020-2023  润新知