首页 > 代码库 > hdu 2485 Destroying the bus stations 迭代加深搜索
hdu 2485 Destroying the bus stations 迭代加深搜索
求最少去掉几个公交站使得从s到t的最短路径大于k。
迭代加深搜索。
#include <cstdio>#include <cstring>#include <queue>using namespace std;#define maxn 60#define maxm 50000int n,m,K,cnt,up;int head[maxn],pre[maxn];int road[maxn][maxn];bool del[maxn];queue<int> Q;bool flag;struct Edge{ int from,to,next;}e[maxm];void make(int from,int to){ e[cnt].from=from; e[cnt].to=to; e[cnt].next=head[from]; head[from]=cnt++;}void bfs(){ int i; memset(pre,0,sizeof(pre)); pre[1]=-1; Q.push(1); while(!Q.empty()) { int u=Q.front();Q.pop(); for(i=head[u];i!=-1;i=e[i].next) { if(del[e[i].to]==0&&pre[e[i].to]==0) { pre[e[i].to]=u; Q.push(e[i].to); } } }}void dfs(int x){ int i; //if(flag==true) return ; bfs(); if(pre[n]==0) { flag=true; return ; } int num=0; for(i=n;i!=-1;i=pre[i]) { num++; road[x][num]=i; } for(i=1;i<=num;i++) if(num-1>K) { flag=true; return; } if(x>up) return; for(i=num-1;i>1;i--) { del[road[x][i]]=1; dfs(x+1); del[road[x][i]]=0; }}int main(){ while(1) { int i,j,u,v; scanf("%d%d%d",&n,&m,&K); if(n==0) break; cnt=0; flag=0; memset(head,-1,sizeof(head)); for(i=1;i<=m;i++) { scanf("%d%d",&u,&v); make(u,v); } for(i=0;i<=n-2;i++) { up=i; memset(del,0,sizeof(del)); dfs(1); if(flag==true) break; } printf("%d\n",up); } return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。