#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;
}
hdu-2485-bfs+dfs
最新推荐文章于 2021-05-06 15:52:39 发布