HDU2485(Destroying the bus stations)BFS+DFS

來源:互聯網
上載者:User
/**********************************************************************題意:有n個車站, 車站間為有向邊, 可能有重, 無自環;有軍隊要從1號站去n號站, 每條邊要走1分鐘;若炸掉一個車站則所有與此站相連的邊都不可走;問至少炸多少站使得軍隊到達n號站的時間超過k分鐘;分析:對於一條邊(u,v)dist[1][u]+dist[v][n]+1<=k;那麼如果當前1->u的最短路徑大於k則說明這條路徑上的點u、v可以暫時不予考慮即只需考慮 dist[1][u]+dist[v][n]+1<=k的情況,那麼根據dist重新構圖;滿足dist[1][u]+dist[v][n]+1<=k的點(u,v)就加入圖中;根據題意就是要保證這個圖不能連通,那麼求出這個圖的點連通度就OK了演算法:最短路的演算法幾個演算法在這個題上都可以用;但是又由於它資料的特殊性,即每條邊的權值為1;所以可以用bfs(相對於幾種最短路的演算法效率較高)來求每一次的最短路徑;然後用dfs實現刪除最短路徑上的點即可;**********************************************************************/#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<vector>#include<queue>using namespace std;const int N=55;int dist[N];int map[N][N];bool visit[N];int n,m,k,tot;bool flag;queue<int> Q;vector<int> edge[N];void bfs(){    memset(dist,-1,sizeof(dist));    while(!Q.empty())        Q.pop();    Q.push(1);    dist[1]=0;        while(!Q.empty())    {        int s=Q.front();        Q.pop();        for(int i=0; i<edge[s].size(); i++)        {            int x=edge[s][i];            if(!visit[x]&&dist[x]==-1)            {                Q.push(x);                dist[x]=s;                if(x==n)                    return ;            }        }    }}void dfs(int x){    if(flag)        return;    bfs();    if(dist[n]==-1)    {        flag=1;        return ;    }    int num=0;    for(int i=n; i>1; i=dist[i])    {        num++;        map[x][num]=i;    }    if(num>k)    {        flag=1;        return ;    }    if(x>tot)        return;    for(int i=2; i<=num; i++)    {        visit[map[x][i]]=1;        dfs(x+1);        visit[map[x][i]]=0;    }}int solve(){    flag=0;    for(int i=0; i<=n; i++)    {        tot=i;        memset(visit,0,sizeof(visit));        dfs(1);        if(flag)            return i;    }    return n;}int main(){    //freopen("C:\\Users\\Administrator\\Desktop\\kd.txt","r",stdin);    while(~scanf("%d%d%d",&n,&m,&k))    {        if(n+m+k==0)            break;        for(int i=0; i<=n; i++)            edge[i].clear();        for(int i=0; i<m; i++)        {            int u,v;            scanf("%d%d",&u,&v);            edge[u].push_back(v);        }        printf("%d\n",solve());    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.