題目概述:
給出一張有向圖,新增最少的邊使這張圖強連通,求最少需要新增的邊數。
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 12using
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...