1. 程式人生 > >2015 ACM Amman Collegiate Programming Contest 題解

2015 ACM Amman Collegiate Programming Contest 題解

#include <bits/stdc++.h>
using namespace std;

const int N  = 2e5 + 10;
int dfn[N],low[N],dfs_clock;

int n, m;
int h[N], to[N], nx[N], sz;

int bridge[N];

int belong[N];
int block;

int p1, p2;
int dis1, dis2;
int f[N];

vector<int> g[N];

void add(int a, int b) {
  to[sz] = b;
  nx[sz] = h[a];
  h[a] = sz ++;
}

void tarjan(int u, int fa)
{
  dfn[u] = low[u] = ++dfs_clock;
  bool flag = false;
  for(int i=h[u]; i != -1; i = nx[i])
  {
    int v = to[i];
    if(v==fa && !flag)//如果有重邊,那麼邊(u,v)被存了兩次,所以,如果第二次訪問,就讓他通過
    {
      flag = true;
      continue;
    }
    if(dfn[v] == 0)
      tarjan(v,u);
    low[u] = min(low[u],low[v]);
    if(low[v] > dfn[u]) {
      //cntCut++;
      bridge[i] = 1;
    }
  }
}

void dfs(int x) {
  belong[x] = block;
  for(int i = h[x]; i != -1; i = nx[i]) {
    if(bridge[i]) continue;
    if(belong[to[i]]) continue;
    dfs(to[i]);
  }
}

void dfs1(int x, int y) {
  f[x] = 1;
  if(y > dis1) {
    dis1 = y;
    p1 = x;
  }
  for(int i = 0; i < g[x].size(); i ++) {
    if(f[g[x][i]]) continue;
    dfs1(g[x][i], y + 1);
  }
}

void dfs2(int x, int y) {
  f[x] = 1;
  if(y > dis2) {
    dis2 = y;
    p2 = x;
  }
  for(int i = 0; i < g[x].size(); i ++) {
    if(f[g[x][i]]) continue;
    dfs2(g[x][i], y + 1);
  }
}

int main()
{
  int T;
  scanf("%d", &T);
  while(T--) {
    scanf("%d%d",&n,&m);
    
    sz = 0;
    dfs_clock = 0;
    memset(dfn, 0, sizeof dfn);
    memset(low,0,sizeof low);
    
    for(int i = 0; i <= n; i ++) {
      h[i] = -1;
    }
    for(int i=0; i<m; ++i)
    {
      int a, b;
      scanf("%d%d",&a,&b);
      add(a, b);
      add(b, a);
    }
  
    memset(bridge, 0, sizeof bridge);
    tarjan(1, -1);
    for(int i = 0; i < sz; i ++) {
      if(bridge[i]) bridge[i ^ 1] = 1;
    }
    
    /*
    for(int from = 1; from <= n; from ++) {
      for(int i = h[from]; i != - 1; i = nx[i]) {
        if(bridge[i])
          printf("%d - %d\n", from, to[i]);
      }
    }
     */
    
    memset(belong,0,sizeof belong);
    block = 0;
    for(int i = 1; i <= n; i ++) {
      if(belong[i] == 0) {
        block ++;
        dfs(i);
      }
    }
    
    /*
    for(int i = 1; i <= n; i ++) {
      cout << i << " " << belong[i] << endl;
    }
     */
    
    for(int i = 1; i <= block; i ++) {
      g[i].clear();
    }
    
    for(int from = 1; from <= n; from ++) {
      for(int i = h[from]; i != - 1; i = nx[i]) {
        if(bridge[i]) {
       //   cout << belong[from] << " " << belong[to[i]] << endl;
          g[belong[from]].push_back(belong[to[i]]);
          g[belong[to[i]]].push_back(belong[from]);
        }
      }
    }
    
    memset(f,0,sizeof f);
    p1 = 0;
    dis1 = 0;
    dfs1(1, 0);
    
    memset(f,0,sizeof f);
    p2 = 0;
    dis2 = 0;
    dfs2(p1,0);
    
    printf("%d\n", block - 1 - dis2);
  }
  return 0;
}

相關推薦

2015 ACM Amman Collegiate Programming Contest 題解

#include <bits/stdc++.h> using namespace std; const int N = 2e5 + 10; int dfn[N],low[N],dfs_clock; int n, m; int h[N], to[N], nx[N], sz;

Codeforces Gym 2015 ACM Amman Collegiate Programming Contest

比賽連結: 題目連結: A. Who Is The Winner? 直接排序,複雜度O(nlogn)。 #include<cstdio> #include<cstring> #include<cstdlib> #include&

ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2018) Syria, Lattakia, Tishreen University, April, 30, 2018

and con account stones over ont int ble style ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (

ACM International Collegiate Programming Contest, JUST Collegiate Programming Contest (2018)

debug -a struct 人性 pro ati 銀河 ans n) ACM International Collegiate Programming Contest, JUST Collegiate Programming Contest (2018) B. New

GYM-ACM International Collegiate Programming Contest, JUST Collegiate Programming Contest (2018)

GYM 兩星級難度還是比較簡單,隨便寫個題解吧。 http://codeforces.com/gym/101853 A - Zero Array  沒啥好講的的,離散化一下就隨便寫。 #include<bits/stdc++.h> #define lson rt

2015-2016 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2015) Goblin Garden Guards (數論)

題目大意:在第一象限記憶體在著n個黑點,然後同時存在著圓,求出不在圓內的個數 解題思路:本來這道題在資料很小的時候可以暴力去判,但是發現這個資料太大,所以需要進行優化和處理,我們列舉每個圓,找出這個

The 2018 ACM-ICPC Chinese Collegiate Programming Contest Take Your Seat

scanf com 分享圖片 pro name string 技術 證明 double /* 證明過程如下 :第一種情況:按1到n的順序上飛機,1會隨意選一個,剩下的上去時若與自己序號相同的座位空就坐下去,若被占了就也會隨意選一個。求最後一個人坐在應坐位置的概率 *

Nordic Collegiate Programming Contest 2015? G. Goblin Garden Guards

輸入 href html sin con seve nod desc title In an unprecedented turn of events, goblins recently launched an invasion against the Nedewsian

The 15th Zhejiang Provincial Collegiate Programming Contest(部分題解

begin iter 一個數 ons opera cst style string += ZOJ 4024 Peak 題意 給出n和n個數,判斷該數列是否是凸形的。 解題思路 從前往後第一對逆序數,和從後往前第一隊逆序數,如果都非零而且相鄰,證明該數組是凸形的。 代碼

2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) A. Altruistic Amphibians DP

題目連結:https://codeforc.es/gym/101933/problem/A 題意:有 n 只青蛙在一個坑裡面,要求可以跳出坑的青蛙的最大數量。每個青蛙有 3 種屬性:l 為青蛙一次可以跳的高度,w 為青蛙的重量,h 為青蛙作為墊背時的高度,墊背的前提是墊背的青蛙的重量比在他上面的青蛙的總重量

2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) D. Delivery Delays 二分+最短路+DP

題目連結:https://codeforc.es/gym/101933/problem/D 題意:地圖上有 n 個位置和 m 條邊,每條邊連線 u、v 且有一個距離 w,一共有 k 個詢問,每個詢問表示 ti 時間在位置 ui 有人下單點了披薩,而披薩店在 di 時間做好披薩可以送出去,披薩店在位置 1,送

2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)

傳送門 A.Altruistic Amphibians     一個挺有意思的題目。首先考慮這樣的問題:倘若要讓儘可能多的青蛙能夠逃跑,則顯然羅漢最好疊得儘可能的高(這才能使得那些不能一次性跳出的青蛙能夠逃離)。     而顯然,對於那些體重最

A - Multiplication Dilemma (思維)( 2018 ACM ICPC Arabella Collegiate Programming Contest

滴答滴答---題目連結  Multiplication operation is not always easy! For example, it is hard to calculate 27 × 20 using your mind, but it is eas

Gym - 101808E Floods ACM ICPC, Damascus University Collegiate Programming Contest(2018)-E

傳送門:http://codeforces.com/gym/101808/problem/E E-Floods You probably heard and even saw the heavy rains that flooded the streets of Damascus rec

2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017)(solve7/11)

B題 題意:給你n個人的第一棒的速度和其他棒的速度,然後讓你輸出最快的那個組合,輸出時間和人。 思想:模擬 D題 題意:給你n個01串代表每個人的特徵,現在讓你求一個和他們長度相等但是和他們相似度最對的那個串。 思想:考慮最短路問題,將每個串拆出來k個差一位的子

Multiplication Dilemma (思維)( 2018 ACM ICPC Arabella Collegiate Programming Contest

Multiplication operation is not always easy! For example, it is hard to calculate 27 × 20 using your mind, but it is easier to find the

2018 ACM-ICPC, Syrian Collegiate Programming Contest F - Pretests SOS dp

#include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PLL pair<LL, LL> #define

2013-2014 ACM-ICPC Brazil Subregional Programming Contest 題解

【題目連結】 這場比賽題面英文都好長... ... 模擬。 #include <bits/stdc++.h> using namespace std; int main() { int a,b,c; cin>>a>>b>>

2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017) 部分題/平衡樹/最小環/思路bfs

交題地址 難度按照順序遞增 J - Judging Moose 隊友敲的 #include <iostream> #include <cstdio> using namespace std; int main() {

2017-2018 ACM-ICPC Nordic ——Problem G 。Galactic Collegiate Programming Contest

Time limit: 6  secondsPicture by GuillaumePreat on Pixabay, cc0One hundred years from now, in 2117, the InternationalCollegiate Programmi