題意:
給出n個點和他們之間的一些關係..
問加多少條邊可以使所有的點變成強連通分量..
思路:
根據題意就可以知道有這個推理:
原圖縮點後的有向無環圖..
出度為0的點和入度為0的點中個數少的那些點向個數多的那些點連線..
可以使森林變成強連通分量..
tips:
注意如果縮點後變成乙個點了..
則入度為0和出度為0的點的個數都是1 但是實際上已經是強連通分量..不需要連線了..
所以答案應該是0
code:
view code
1 #include 2 #include 3 #include 4using
namespace
std;
5const
int inf = 0x1f1f1f1f;6
#define clr(x) memset(x, 0, sizeof(x))
7const
int maxn = 20010;8
9struct
edge
10edge[10000010
];14
inthead[maxn];
15int
tot;
1617
void add(int s, int
u)18
2324
intdfn[maxn], low[maxn];
25int
ins[maxn], sta[maxn], col[maxn];
26int
ti, top, cnt;
27int
n;28
29void tarjan(int
u)30
else
if(ins[k]) 43}
44if(dfn[u] ==low[u]) while(u !=k);52}
5354}55
56void
solve_ta()
5765
66int
ans;
67int
in[maxn], out
[maxn];
68void
solve()
6982}83
}8485int tmpa = 0, tmpb = 0;86
for(i = 1; i <= cnt; ++i)
9091 ans =max(tmpa, tmpb);
92if(cnt == 1) ans = 0;93
}9495int
main()
96110
solve();
111 printf("
%d\n
", ans);
112}
113return0;
114 }
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 2767 強連通縮點
如a能證明b 就建一條有向邊a b。對於乙個能互相證明的乙個集合,必然每個2個點都能相互到達,這樣的乙個集合就是乙個強連通集合。我們可以把他們看成乙個點,剩下的就是乙個dag圖了。如要都能相互到達,每個點必然出度 1,入度 1 所以統計有多少沒有入度的點和多少沒有出度的點,他們中最大的就是需要新增的...
hdu2767 強連通分量
hdu2767 proving equivalences 傳送門題意 給定乙個 n 1 leq n leq 20000 個頂點,m 0 leq m leq 50000 條邊的有向圖,至少新增幾條邊可以使得整個圖變成強連通圖?題解 強連通分量縮點,判斷每個點的出度或者入度是否為零,最終結果為出度為零的...