zoukankan      html  css  js  c++  java
  • 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
    ",ans);
    84   }
    85 }
    View Code
  • 相关阅读:
    Web版RSS阅读器(五)——初步完成阅读功能
    袁氏-人物-袁赋城:百科
    汉语-词语-慧根:百科
    汉语-词语-善根:百科
    汉语-词语-阴德:百科
    汉语-词语-福报:百科
    汉语-词语-回响:百科
    汉语-词语-领悟:百科
    汉语-词语-开悟:百科
    汉语-词语-业障:百科
  • 原文地址:https://www.cnblogs.com/chujian123/p/3867685.html
Copyright © 2011-2022 走看看