CCF認證 2015 09 高速公路

2021-08-15 17:02:07 字數 1101 閱讀 7300

要找可以兩兩連通的點個數,可以先找整個圖的強連通分量,每個強連通分量中的所有點兩兩之間都可以互相到達

先用tarjan演算法找到所有強連通分量,假如乙個強連通分量中有n個點,那麼就有((n-1)+1)*n/2對互通點(等差求和)

找了乙個模板,套用進來寫下主函式就ok了

#include#include#include#include#includeusing namespace std;

// tarjan演算法 複雜度o(n+m)

const int maxn = 10010;//點數

const int maxm = 100010;//邊數

struct edge

edge[maxm];

int head[maxn],tot;

int low[maxn],dfn[maxn],stack[maxn],belong[maxn];//belong陣列的值是1~scc

int index,top;

int scc;//強連通分量的個數

bool instack[maxn];

int num[maxn];//各個強連通分量包含點的個數,陣列編號1~scc

//num陣列不一定需要,結合實際情況

void addedge(int u,int v)

void tarjan(int u)

else if(instack[v] && low[u] > dfn[v])

low[u] = dfn[v];

} if(low[u] == dfn[u])

while( v != u); }}

void solve(int n)

void init()

int main()

solve(n); //求出強連通分量,個數為scc,每個分量點的個數儲存在num[i]中

int ans=0;

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

ans+=(num[i]-1)*num[i]/2; //等差數列求和

printf("%d\n",ans);

return 0;

}

ccf 高速公路

問題描述 某國有n個城市,為了使得城市間的交通更便利,該國國王打算在城市之間修一些高速公路,由於經費限制,國王打算第一階段先在部分城市之間修一些單向的高速公路。現在,大臣們幫國王擬了乙個修高速公路的計畫。看了計畫後,國王發現,有些城市之間可以通過高速公路直接 不經過其他城市 或間接 經過乙個或多個其...

CCF高速公路

新學了tarjan演算法,今天中午之前還沒聽過,用dfs硬寫加了點優化得了70,對路的演算法還是給力,直接滿分。回頭整理一篇關於強連通分量的部落格,另外這次往後就慢慢全用c 了。include include include include define maxsize 10005 using na...

ccf 高速公路 100

試題編號 201509 4 試題名稱 高速公路 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 某國有n個城市,為了使得城市間的交通更便利,該國國王打算在城市之間修一些高速公路,由於經費限制,國王打算第一階段先在部分城市之間修一些單向的高速公路。現在,大臣們幫國王擬了乙個修高速公...