hdu2767 proving equivalences
傳送門題意
給定乙個\(n(1\leq n\leq 20000)\)個頂點,\(m(0\leq m\leq 50000)\)條邊的有向圖,至少新增幾條邊可以使得整個圖變成強連通圖?
題解
強連通分量縮點,判斷每個點的出度或者入度是否為零,最終結果為出度為零的點的個數與入度為零的點的個數的最大值
圖連通時的連邊方式,紅色表示新加入的邊
圖不連通時的連邊方式,紅色表示新加入的邊
ps:如果原圖本身就是強連通圖,需要特判結果為零
#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long
#define pii pair#define pll pair#define pi acos(-1.0)
#define eps 1e-6
#define lowbit(x) x&(-x)
using namespace std;
const int maxn=20010,maxm=50010;
int t,n,m;
int head[maxn],nxt[maxm],to[maxm],cnt;
int dfn[maxn],low[maxn],scc[maxn],stk[maxn],top,dfscnt,scccnt;
int in[maxn],out[maxn];
void add(int x,int y)
void tarjan(int u)
else if(!scc[v])
}if(dfn[u]==low[u])
}}int main()
for(int i=1;i<=n;i++)
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
for(int i=1;i<=n;i++)}}
int ans1=0,ans2=0;
for(int i=1;i<=scccnt;i++)
if(scccnt==1) printf("0\n");
else printf("%d\n",max(ans1,ans2));
}return 0;
}
hdu 2767強連通分量練習
判斷強連通圖之後,果斷要做做強連通分量的題目,之前做求割點的題目的時候就已經學過了tarjan演算法了。但是還是不會用,一開始看到這個題目的時候不知道怎麼辦,感覺就是有種怪怪的感覺。看了網上的 出度和入度的判斷真的還蠻精妙的。通過一邊tarjan演算法已經將乙個圖分解成了很多個前連通圖了。這要計算出...
Hdu 2767 把森林變成強連通分量 cpp
題意 給出n個點和他們之間的一些關係.問加多少條邊可以使所有的點變成強連通分量.思路 根據題意就可以知道有這個推理 原圖縮點後的有向無環圖.出度為0的點和入度為0的點中個數少的那些點向個數多的那些點連線.可以使森林變成強連通分量.tips 注意如果縮點後變成乙個點了.則入度為0和出度為0的點的個數都...
hdu 1269 hdu 2767 強連通分量)
1 include2 include3 include4 const int maxn 10000 10 5 using namespace std 6 vectormp maxn 7 stacks 8int n,m 9int count 10int cnt 11bool mark maxn 12i...