首页 > 代码库 > Destroying the bus stations
Destroying the bus stations
hdu2485:http://acm.hdu.edu.cn/showproblem.php?pid=2485
题意:给你一个图,让你删除其中的一些点,然后使得1到n的最小距离大于k,求删除的最小的点数。
题解:DFS枚举最短路径上的点。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 #define inf 100000000 7 using namespace std; 8 const int N=55; 9 const int E=20000;10 int dist[N],del[N][N],vis[N],head[N];11 bool visit[N];12 int n,m,k,cnt,ans,u,v,pre[N];13 struct Node{14 int v;15 int next;16 }edge[E];17 void init(){18 memset(head,-1,sizeof(head));19 memset(visit,0,sizeof(visit));20 memset(pre,0,sizeof(pre));21 cnt=0;22 ans=inf;23 }24 void add(int u,int v){25 edge[cnt].v=v;26 edge[cnt].next=head[u];27 head[u]=cnt++;28 }29 bool BFS(){30 for(int i=1;i<=n;i++){31 dist[i]=inf;32 vis[i]=false;33 }34 queue<int>Q;35 vis[1]=1;36 dist[1]=0;37 Q.push(1);38 while(!Q.empty()){39 int u=Q.front();40 Q.pop();41 vis[u]=0;42 for(int i=head[u];i!=-1;i=edge[i].next){43 int v=edge[i].v;44 if(!visit[v]&&dist[v]>dist[u]+1){45 dist[v]=dist[u]+1;46 pre[v]=u;47 if(!vis[v]){48 Q.push(v);49 vis[v]=1;50 }51 if(v==n&&dist[v]<=k)return true;52 }53 }54 }55 return false;56 }57 void DFS(int depth){58 if(depth>=ans)return;59 memset(pre,0,sizeof(pre));60 if(!BFS()){61 ans=min(ans,depth);62 return;63 }64 int num=0;65 for(int i=pre[n];i!=1;i=pre[i]){66 del[depth][++num]=i;67 }68 for(int i=1;i<=num;i++){69 visit[del[depth][i]]=true;70 DFS(depth+1);71 visit[del[depth][i]]=false;72 }73 }74 75 int main(){76 while(~scanf("%d%d%d",&n,&m,&k)&&n){77 init();78 for(int i=1;i<=m;i++){79 scanf("%d%d",&u,&v);80 add(u,v);81 }82 DFS(0);83 printf("%d\n",ans);84 }85 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。