1. 程式人生 > >危險係數(dfs判斷圖中聯通性)不是求割點,用dfs判斷聯通性

危險係數(dfs判斷圖中聯通性)不是求割點,用dfs判斷聯通性

問題描述 
抗日戰爭時期,冀中平原的地道戰曾發揮重要作用。 
地道的多個站點間有通道連線,形成了龐大的網路。但也有隱患,當敵人發現了某個站點後,其它站點間可能因此會失去聯絡。 
我們來定義一個危險係數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;

}