zoukankan      html  css  js  c++  java
  • Information

    zoj3630:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3630

    题意:给你一张图,然后让你选择一个点,并且删除它,让图的最大连通分量最小。

    题解:模板题。枚举每个点,然后求最大的连通分量。

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<algorithm>
     5 using namespace std;
     6 const int N=106;
     7 int ans,counts,n,m;
     8 int map1[N][N],map2[N][N],map3[N][N],map4[N][N];
     9 int que[N],tail;
    10 bool used[N],flag;
    11 void init(){
    12   tail=0;
    13   memset(map1,0,sizeof(map1));
    14   memset(map2,0,sizeof(map2));
    15   memset(map3,0,sizeof(map3));
    16   memset(map4,0,sizeof(map4));
    17 }
    18 void DFS0(int u){
    19     if(used[u])return;
    20     used[u]=true;
    21     for(int i=0;i<n;i++)
    22       if(map1[u][i])
    23         DFS0(i);
    24         que[++tail]=u;
    25 }
    26 void DFS1(int u){
    27     if(used[u])return;
    28     used[u]=true;
    29     flag=true;
    30     for(int i=0;i<n;i++)
    31        if(map2[u][i])
    32         DFS1(i);
    33     counts++;
    34 }
    35 int  solve(){
    36     tail=0;
    37     int ans2=0;
    38     memset(used,0,sizeof(used));
    39     for(int i=0;i<n;i++)
    40         DFS0(i);
    41     memset(used,0,sizeof(used));
    42     while(tail){
    43         flag=false;
    44         counts=0;
    45         DFS1(que[tail--]);//从队列中弹出元素
    46         if(flag){
    47            ans2=max(ans2,counts);
    48           }
    49       }
    50  return ans2;
    51 }
    52 void copy(){
    53     for(int i=0;i<n;i++){
    54       for(int j=0;j<n;j++){
    55           map1[i][j]=map3[i][j];
    56           map2[i][j]=map4[i][j];         
    57          }        
    58     }    
    59 }
    60 int main(){
    61     int u,v;
    62     while(~scanf("%d%d",&n,&m)){
    63          init();
    64       for(int i=1;i<=m;i++){
    65         scanf("%d%d",&u,&v);
    66            map1[u][v]=1;
    67            map2[v][u]=1;
    68            map3[u][v]=1;
    69            map4[v][u]=1;
    70       }
    71       ans=1000000;
    72       for(int i=0;i<n;i++){
    73              copy();
    74             for(int j=0;j<n;j++){
    75                   map1[i][j]=map1[j][i]=0;
    76                   map2[j][i]=map2[i][j]=0;         
    77             }
    78             ans=min(ans,solve());
    79       }
    80       if(ans<=1)printf("0
    ");
    81       else 
    82        printf("%d
    ",ans);
    83     }
    84 }
    View Code
  • 相关阅读:
    [转][html5]网页横屏
    [转][EasyUI]扩展 DateBox
    [转][C#]枚举的遍历Enum
    [转][C#]单例模式之懒加载
    [C#][Quartz]添加监听器
    [C#][Quartz]帮助类
    [转]Win 10 的 Win 按键没反应
    转来的--轻松自动化---selenium-webdriver(python) (七)---定位iframe——转来的
    安装charles
    遇到的问题汇总
  • 原文地址:https://www.cnblogs.com/chujian123/p/3839593.html
Copyright © 2011-2022 走看看