危險係數(dfs判斷圖中聯通性)不是求割點,用dfs判斷聯通性
阿新 • • 發佈:2018-11-12
問題描述
抗日戰爭時期,冀中平原的地道戰曾發揮重要作用。
地道的多個站點間有通道連線,形成了龐大的網路。但也有隱患,當敵人發現了某個站點後,其它站點間可能因此會失去聯絡。
我們來定義一個危險係數DF(x,y):
對於兩個站點x和y (x != y), 如果能找到一個站點z,當z被敵人破壞後,x和y不連通,那麼我們稱z為關於x,y的關鍵點。相應的,對於任意一對站點x和y,危險係數DF(x,y)就表示為這兩點之間的關鍵點個數。
本題的任務是:已知網路結構,求兩站點之間的危險係數。
#include<bits/stdc++.h> using namespace std; int maps[2006][2006]; bool visit[2006]; int n,m,flag; void dfs(int x,int y,int z) { if(!visit[x]&&flag!=1) {//判斷未走過這個點還有已經判斷為聯通; if(x==y) {//到達終點; flag=1; return ; } for(int i=1; i<=n; i++) { if(!visit[i]&&maps[x][i]==1&&i!=z) { visit[x]=1;//標記 dfs(i,y,z);//深度優先搜尋 visit[x]=0;//標記回來; } } } } int main() { cin>>n>>m; int u,v; for(int i=1; i<=m; i++) { cin>>u>>v; maps[u][v]=maps[v][u]=1;//無向圖; } cin>>u>>v; dfs(u,v,0);//看是否聯通; if(!flag) { cout<<"-1"<<endl; return 0; } int cnt=0; for(int i=1; i<=n; i++) { if(i==u||i==v)continue; memset(visit,0,sizeof(visit)); flag=0; dfs(u,v,i); if(!flag)++cnt; } cout<<cnt<<endl; return 0; }