zoukankan      html  css  js  c++  java
  • 2013 南京理工大学邀请赛B题

    思路:

    每次枚举删除一个点,然后对剩下的点求出关键点,判断删除哪个关键点获得的连通分支数最大。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<map>
    #define Maxn 5100
    #define Maxm 50100
    #define inf 0x7fffffff
    using namespace std;
    map<int,int> p[Maxn];
    int Index[Maxn],dfn[Maxn],low[Maxn],vi[Maxn],compent[Maxn],e,n,lab,Max=0;
    struct Edge{
        int from,to,next;
    }edge[Maxm];
    inline int min(int a,int b)
    {
        return a<b?a:b;
    }
    inline int max(int a,int b)
    {
        return a>b?a:b;
    }
    void init()
    {
        memset(Index,-1,sizeof(Index));
        memset(dfn,0,sizeof(dfn));
        memset(low,0,sizeof(low));
        memset(vi,0,sizeof(vi));
        memset(compent,0,sizeof(compent));
        for(int i=0;i<=n;i++)
            p[i].clear();
        e=lab=Max=0;
    }
    void Init()
    {
        memset(dfn,0,sizeof(dfn));
        memset(low,0,sizeof(low));
        memset(vi,0,sizeof(vi));
        memset(compent,0,sizeof(compent));
        lab=Max=0;
    }
    void addedge(int from,int to)
    {
        edge[e].from=from;
        edge[e].to=to;
        edge[e].next=Index[from];
        Index[from]=e++;
    }
    void dfs(int u,int farther)
    {
        dfn[u]=low[u]=++lab;
        int i,temp;
        for(i=Index[u];i!=-1;i=edge[i].next)
        {
            temp=edge[i].to;
            if(!vi[temp])
            {
                if(!dfn[temp])
                {
                    dfs(temp,u);
                    if(low[temp]>=dfn[u])
                    {
                        compent[u]++;
                        //cout<<u<<" * "<<compent[u]<<" "<<low[temp]<<" "<<temp<<endl;
                        Max=max(Max,compent[u]);
                    }
                    low[u]=min(low[u],low[temp]);
                }
                if(temp!=farther)
                    low[u]=min(low[u],dfn[temp]);
            }
        }
    }
    int main()
    {
        int i,j,m,a,b;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            init();
            for(i=1;i<=m;i++)
            {
                scanf("%d%d",&a,&b);
                a++;
                b++;
                if(!p[a][b])
                {
                addedge(a,b);
                addedge(b,a);
                p[a][b]=p[b][a];
                }
            }
            int num=0;
            int v;
            int ans=0;
            int flag=1;
            for(i=1;i<=n;i++)
            {
                Init();
                vi[i]=1;
                num=0;
                flag=1;
                for(j=1;j<=n;j++)
                {
                    if(!vi[j]&&!dfn[j])
                    {
                        compent[j]=-1;
                        dfn[j]=low[j]=++lab;
                        num++;
                        
                        for(int k=Index[j];k!=-1;k=edge[k].next)
                        {
                            v=edge[k].to;
                            if(!dfn[v]&&!vi[v])
                            {
                                flag=0;
                                compent[j]++;
                                Max=max(Max,compent[j]);
                                dfs(v,j);
                            }
                        }
                    }
                }
                if(flag)
                    num--;
                vi[i]=0;
                ans=max(ans,num+Max);
                //cout<<num<<" "<<Max<<endl;
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    .net4.0注册到IIS ,重新注册IIS ,iis注册
    进制转换
    hasOwnProperty实现剔除数组中重复项
    URLStream加载美术资源
    随机排序数组
    post与get的区别
    【转】二进制、八进制、十进制、十六进制之间转换
    数组的sort方法
    【学习篇】JavaScript访问样式表
    【学习篇】JavaScript去除字符串空格
  • 原文地址:https://www.cnblogs.com/wangfang20/p/3203983.html
Copyright © 2011-2022 走看看