如a能證明b ,就建一條有向邊a->b。對於乙個能互相證明的乙個集合,必然每個2個點都能相互到達,這樣的乙個集合就是乙個強連通集合。我們可以把他們看成乙個點,剩下的就是乙個dag圖了。 如要都能相互到達,每個點必然出度 >=1, 入度》1 .。所以統計有多少沒有入度的點和多少沒有出度的點,他們中最大的就是需要新增的邊了。
view code
#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define eps 1e-8
#define ex 2.7182818284590452354
#define pi acos(-1.0)
#define inf 0x3fffffff
#define dc(n) printf("case #%d:",++n)
#define sd(n) scanf("%d",&n)
#define ss(str) scanf("%s",str)
#define sdb(n) scanf("%lf",&n)
#define ll long long
#define mm 1000000007
#define mmax 20010
using namespace std;
struct node
e[50010];
int p[mmax];
int num;
void add(int st,int en)
void init()
int fa[mmax];
int dfn[mmax];
int low[mmax];
int times;
int q[mmax];
int pp;
bool instack[mmax];
int find(int x)
void tarjin(int u)
else if(instack[v])
low[u]=min(low[u],dfn[v]);
}if(dfn[u]==low[u])
}}int in[mmax];
int out[mmax];
int main()
{ int t;
cin>>t;
while(t--)
{init();
int n,m;
cin>>n>>m;
for(int i=0;i
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...
hdu2767強連通加縮點
題目說了一大堆,前面的沒有用,就是讓你判斷要加幾條邊才能強連通,用到縮點的知識 二重迴圈,判斷鄰接表下乙個點是不是在強連通分量中,入度,出度分別儲存下來,輸出較大的那乙個 include include include include include include include include ...
hdu2767 強連通分量
hdu2767 proving equivalences 傳送門題意 給定乙個 n 1 leq n leq 20000 個頂點,m 0 leq m leq 50000 條邊的有向圖,至少新增幾條邊可以使得整個圖變成強連通圖?題解 強連通分量縮點,判斷每個點的出度或者入度是否為零,最終結果為出度為零的...