多校聯賽4的一道題,,給乙個有向圖,問最多加多少條邊後仍然不是強聯通,以前總會遇到問最少加幾條邊讓圖成乙個強連通圖,比賽時自己就找到了答案,當時想著新增最多的邊後一定是將原來的圖連成兩個強連通分量,而兩個強連通分量間的邊最多是兩個聯通分量的點數之積,再加上每個聯通分量內部的點的邊數就是所有的邊數,再減去原來的邊就是新加上的邊了,把圖強連通縮點後,求出每個出度或入度為0的聯通分量為乙個聯通分量,剩餘的所有聯通分量連成乙個聯通分量形成的邊數,取最大的。當時敲完**提交wrong了,就懷疑自己的演算法,自己又證明了一下,如果n個點,分為兩個聯通分量,乙個點數為a,乙個為b,邊數就是a*(a-1)+b*(b-1)+a*b-m=n*n-a*b-n,所以要保證a*b盡量小,所以要選點數最小的入度或出度為0的聯通分量為乙個,剩餘的點為乙個聯通分量,,,,最後發現自己的**有問題,平常總習慣點座標從0開始,所以寫成了i
#include#include#include#define n 100010
using namespace std;
int belong[n],ins[n],low[n],dfs[n],idx,ans,head[n],num,n,m,in[n],out[n],cot[n];
struct edge
e[n];
void addedge(int x,int y)
stackq;
void tarjan(int u)
else if(ins[v]==1)
low[u]=low[u]>dfs[v]?dfs[v]:low[u];
}if(dfs[u]==low[u])
while(v!=u);
ans++;
}}int main()
printf("%d\n",n*n-max*(n-max)-n-m);
}return 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 2767 強連通縮點
如a能證明b 就建一條有向邊a b。對於乙個能互相證明的乙個集合,必然每個2個點都能相互到達,這樣的乙個集合就是乙個強連通集合。我們可以把他們看成乙個點,剩下的就是乙個dag圖了。如要都能相互到達,每個點必然出度 1,入度 1 所以統計有多少沒有入度的點和多少沒有出度的點,他們中最大的就是需要新增的...
強連通縮點 hdu3072
題意 實現某確定一點向其他所有的點直接或者間接地傳遞訊息。如果某幾個點之間訊息可以互達,則不收取費用,求所有點接受到訊息所花費的最小值。連通分量內不收取費用,所以列舉找到聯通分量之間最小值。include include include includeusing namespace std defi...