• ZOJ1311(Network)


    题目链接:传送门

    题目大意:给你一副无向图,求有多少个割点

    题目思路:tarjan算法(此题读入是字符串读入,需注意)

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstdlib>
      4 #include <cmath>
      5 #include <algorithm>
      6 #include <cstring>
      7 #include <stack>
      8 #include <cctype>
      9 #include <queue>
     10 #include <string>
     11 #include <vector>
     12 #include <set>
     13 #include <map>
     14 #include <climits>
     15 #define lson root<<1,l,mid
     16 #define rson root<<1|1,mid+1,r
     17 #define fi first
     18 #define se second
     19 #define ping(x,y) ((x-y)*(x-y))
     20 #define mst(x,y) memset(x,y,sizeof(x))
     21 #define mcp(x,y) memcpy(x,y,sizeof(y))
     22 #define Min(x,y) (x<y?x:y)
     23 #define Max(x,y) (x>y?x:y)
     24 using namespace std;
     25 #define gamma 0.5772156649015328606065120
     26 #define MOD 1000000007
     27 #define inf 0x3f3f3f3f
     28 #define N 10005
     29 #define maxn 1000050
     30 typedef long long LL;
     31 typedef pair<int,int> PII;
     32 
     33 int n,m,ans,son;
     34 int pic[150][150];
     35 int low[150],vis[150],area[150];
     36 int dfn[150],deep;
     37 
     38 inline void init(){
     39     mst(area,0);
     40     mst(vis,0);
     41     mst(pic,0);
     42     ans=son=0;
     43     deep=1;
     44     low[1]=dfn[1]=1;
     45     vis[1]=1;
     46 }
     47 
     48 void dfs(int x){
     49    for(int i=1;i<=n;++i)
     50     if(pic[x][i]){
     51         if(vis[i]){low[x]=min(low[x],dfn[i]);}
     52         else{
     53             vis[i]=1;
     54             low[i]=dfn[i]=++deep;
     55             dfs(i);
     56             low[x]=min(low[x],low[i]);
     57             if(low[i]>=dfn[x]){
     58                 if(x==1)++son;
     59                 else ++area[x];
     60             }
     61         }
     62     }
     63 }
     64 
     65 void read(){
     66     char str[1000];
     67     while(gets(str)){
     68         if(!strcmp("0",str))break;
     69         int len=strlen(str);
     70         int i=0,temp=0;
     71         while(str[i]==' ')++i;
     72         while(isdigit(str[i])){
     73             temp=temp*10+str[i]-'0';
     74             ++i;
     75         }
     76         int x=temp;
     77         while(i<len){
     78             temp=0;
     79             while(str[i]==' ')++i;
     80             while(isdigit(str[i])){
     81                 temp=temp*10+str[i]-'0';
     82                 ++i;
     83             }
     84             pic[x][temp]=pic[temp][x]=1;
     85         }
     86     }
     87 }
     88 
     89 int main(){
     90     int i,j,group,Case=0,x,y;
     91     while(scanf("%d",&n)!=EOF&&n){
     92         getchar();
     93         init();
     94         read();
     95         dfs(1);
     96         if(son>1)++ans;
     97         for(i=1;i<=n;++i)
     98             if(area[i])
     99                 ++ans;
    100         printf("%d
    ",ans);
    101     }
    102     return 0;
    103 }
  • 相关阅读:
    C# 文件类的操作---删除
    C#实现Zip压缩解压实例
    UVALIVE 2431 Binary Stirling Numbers
    UVA 10570 meeting with aliens
    UVA 306 Cipher
    UVA 10994 Simple Addition
    UVA 696 How Many Knights
    UVA 10205 Stack 'em Up
    UVA 11125 Arrange Some Marbles
    UVA 10912 Simple Minded Hashing
  • 原文地址:https://www.cnblogs.com/Kurokey/p/5519929.html
Copyright © 2020-2023  润新知