hdu-2485-bfs+dfs

来源:互联网 发布:淘宝浴衣与羽织的区别 编辑:程序博客网 时间:2024/05/29 13:10
#include<stdio.h>#include<string.h>#include<queue>#include<vector>using namespace std;const int INF = 0x3f3f3f3f;struct Node{    int id;    int step;    Node(){}    Node(int a,int b):id(a),step(b){}};int n,m,k;int ans;int pre[55];int G[55][55];int vis[55];int del[55];int bfs(int s){    memset(vis,0,sizeof(vis));    memset(pre,0,sizeof(pre));    queue<Node> q;    q.push(Node(s,0));    while(!q.empty()){        Node ct = q.front();        q.pop();        if(ct.id == n){            return ct.step;        }        for(int i = 1;i <= n;i++){            if(!del[i] && !vis[i] && G[ct.id][i]){                vis[i] = 1;                pre[i] = ct.id;                q.push(Node(i,ct.step+1));            }        }    }    return -1;}void dfs(int num){    if(num >= ans) return;    int now = bfs(1);    if(now == -1 || now > k){        ans = num < ans ? num : ans;        return;    }    int x = pre[n];    int road[55];//注意这里需要提前记录改路径上的点,因为当你深搜下去之后pre数组就变了    int cnt = 0;    while(x != 1){        road[cnt++] = x;        x = pre[x];    }    for(int i = 0;i < cnt;i++){        del[road[i]] = 1;        dfs(num+1);        del[road[i]] = 0;    }}int main(){    while(scanf("%d%d%d",&n,&m,&k) && (n && m && k)){        memset(G,0,sizeof(G));        memset(del,0,sizeof(del));        ans = INF;        for(int i = 0;i < m;i++){            int u,v;            scanf("%d%d",&u,&v);            G[u][v] = 1;        }        dfs(0);        printf("%d\n",ans);    }    return 0;}
原创粉丝点击