要找可以兩兩連通的點個數,可以先找整個圖的強連通分量,每個強連通分量中的所有點兩兩之間都可以互相到達
先用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個城市,為了使得城市間的交通更便利,該國國王打算在城市之間修一些高速公路,由於經費限制,國王打算第一階段先在部分城市之間修一些單向的高速公路。現在,大臣們幫國王擬了乙個修高速公...