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