HDOJ2767 3836解題報告 強連通分量

2022-03-01 10:48:58 字數 1802 閱讀 3046

題目概述:

給出一張有向圖,新增最少的邊使這張圖強連通,求最少需要新增的邊數。

3836跟2767的題面只有輸入資料的方式差別,注意一下就可以了。

大致思路:

先求出整個圖的強連通分量然後縮點,在新圖中統計出度為0和入度為0的點的個數,最大值即為答案。

有些小細節需要注意,如果原圖強連通應該輸出0而不是1.

**:

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12

using

namespace

std;

1314

#define sacnf scanf

15#define scnaf scanf

16#define maxn 20010

17#define maxm 26

18#define inf 1061109567

19#define eps 0.00001

20const

double pi=acos(-1.0

);21

#define mod 7

22#define maxnum 10000

23void swap(int &a,int &b)

24int abs(int x)

25 typedef long

long

ll;26 typedef unsigned int

uint;27

28int

n,m;

29 vectorg[maxn];

30 stacks;

3132

intpre[maxn],low[maxn],scc[maxn];

33int

dfs_clock,scc_cnt;

34int

in[maxn],out

[maxn];

3536

void dfs(int

u)37

48else

if(!scc[v]) low[u]=min(low[u],pre[v]);49}

50if(pre[u]==low[u])

5159}60

}6162void

find_scc()

6371

72int

main()

7388

find_scc();

89for(int i=1;i<=scc_cnt;i++) in[i]=out[i]=0;90

for(int i=1;i<=n;i++)

9199

}100

int ans1=0,ans2=0

;101

for(int i=1;i<=scc_cnt;i++)

102106 printf("

%d\n

",(scc_cnt==1)?0

:max(ans1,ans2));

107}

108//

clock_t ed=clock();

109//

printf("\n\ntime used : %.5lf ms.\n",(double)(ed-st)/clocks_per_sec);

110return0;

111 }

HDOJ 1217 Arbitrage 解題報告

求最短路的題,與普通最短路不同的地方是運算是用乘法而不是加法。題意 套匯是指利用不同外匯市場 的外匯差價,在某一外匯市場上買進某種貨幣 同時在另一外匯市場上賣出該種貨幣,以賺取利潤 這種利潤稱之為套利。比如1美元可以買0.5英鎊,而1英鎊可以買10法郎,2法郎可以買1美元,那麼可用通過套匯使用1美元...

USACO Hamming Codes 解題報告

資料小,暴力搜尋可以搞定。但是推薦使用dfs,每個節點 數 有取與不取兩個分支。注意 0是必須出現的。證明如下 最終得到的結果序列中,0是必須出現的,證明如下 如果存在另乙個滿足要求的結果序列s 其最小值為a1 n 0,那麼序列s s n 是滿足條件的最小解,且首元素為0 id xpli1 prog...

USACO Closed Fences 解題報告

幾何題看著就很有畏懼感。這裡用的是最 的演算法,時間複雜度應該在n 2。還沒看別人的解題報告,不過我猜nlogn的解法是有的。比如判斷乙個fence是不是valid的時候,這裡將所有的線段兩兩比較,看是否相交。但是有個叫line sweep的演算法,可以在nlogn的時間複雜度內完成。既然accep...