HDU 1827 強聯通縮點

2021-06-20 07:46:53 字數 1211 閱讀 7436

輸入n、m ,n表示人數和m是聯絡對數。每對人的聯絡時單向且可以傳遞,聯絡不同人的花費不同,需要找到花費最少為多少。

題解:強聯通縮點,儲存強聯通分塊所有節點的最小權值,入度為零的即為需要聯絡的聯通分塊

#include#include#include#include#include#include#include#include //#include #include#includeusing namespace std;

#define inf 1e8

#define eps 1e-8

#define ll __int64

#define maxn 26

#define mol 1000000007

#define n 1010

#define m 2010

struct edge

; edge edge[m];//邊的集合

int node[n];//頂點集合

int instack[n];//標記是否在stack中

int stack[n];

int belong[n];//各頂點屬於哪個強連通分量

int dfn[n];//節點u搜尋的序號(時間戳)

int low[n];//u或u的子樹能夠追溯到的最早的棧中節點的序號(時間戳)

int n, m;//n:點的個數;m:邊的條數

int cnt_edge;//邊的計數器

int index;//序號(時間戳)

int top;

int bcnt;//有多少個強連通分量

int in[n],out[n],numd[n],c[n];

void add_edge(int u, int v)//鄰接表儲存

void tarjan(int u)

{ int i, j;

int v;

dfn[u] = low[u] = ++index;

instack[u] = true;

stack[++top] = u;

for (i = node[u]; i != -1; i = edge[i].next)

{ v = edge[i].v;

if (!dfn[v])//如果點v沒被訪問//樹枝邊

{ tarjan(v);

if (low[v]

hdu 1827強連通分量

原題鏈結 題意是有一堆人,和若干關係 單向 你假如選擇了乙個人,那麼其他可以傳遞的都不需要花費就可以得到。問最小花費和最少選擇人數。是乙個求強連通的題目,因為如果我們把強連通分量縮點了以後,那麼其實就是要把入度為0的都選了就可以,注意如果入度為0的是乙個縮點就再列舉找一下裡面最小的。接下來就是很顯然...

hdu 2767 強連通縮點

補最少的邊成強連通圖。縮點後成dag,max即為所求。include include include define mn 20020 define me 200010 define mm a,b as void add e int i,int u,int v void tarjan int i el...

hdu 4635 強連通縮點

多校聯賽4的一道題,給乙個有向圖,問最多加多少條邊後仍然不是強聯通,以前總會遇到問最少加幾條邊讓圖成乙個強連通圖,比賽時自己就找到了答案,當時想著新增最多的邊後一定是將原來的圖連成兩個強連通分量,而兩個強連通分量間的邊最多是兩個聯通分量的點數之積,再加上每個聯通分量內部的點的邊數就是所有的邊數,再減...