当前位置: 首页 > news >正文

HDU 2485 Destroying the bus stations (IDA*+ BFS)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2485


题意:给你n个点,m条相连的边,问你最少去掉几个点使从1到n最小路径>=k,其中不能去掉1,n两个点。

题解:这个题目可以用最小流解决,也可以用IDA* + BFS解决。


AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <list>
#include <deque>
#include <queue>
#include <iterator>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <cctype>
using namespace std;

#define si1(a) scanf("%d",&a)
#define si2(a,b) scanf("%d%d",&a,&b)
#define sd1(a) scanf("%lf",&a)
#define sd2(a,b) scanf("%lf%lf",&a,&b)
#define ss1(s)  scanf("%s",s)
#define pi1(a)    printf("%d\n",a)
#define pi2(a,b)  printf("%d %d\n",a,b)
#define mset(a,b)   memset(a,b,sizeof(a))
#define forb(i,a,b)   for(int i=a;i<b;i++)
#define ford(i,a,b)   for(int i=a;i<=b;i++)

typedef long long LL;
const int N=1005;
const int M=105;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
const double eps=1e-7;

int n,m,k;
int lin[N][N];//邻接表储存
int fa[N];//记录从1到n最短路径
bool vis[N];//标记节点是否被删除
int ans,Min;
bool flag;

struct xh
{
    int x,y,next;
}edge[N];

int bfs()
{
    int q[2222];
    int he=0,ta=0;
    mset(fa,-1);
    fa[1]=0;
    mset(q,0);
    q[ta++]=1;
    while(he!=ta)
    {
        int x=q[he++];
        for(int i=1;i<=lin[x][0];i++)
        {
            int v=lin[x][i];
            if(fa[v]==-1&&!vis[v])
            {
                fa[v]=x;
                q[ta++]=v;
                if(n==v)    return 1;
            }
        }
    }
    return 0;
}

void dfs(int dian,int depth)//求去掉最少个数点
{
    if(flag==false) return ;
    if(dian>depth) return ;

    int p=bfs();
    int sa[N]={0},t=0;
    if(p==0){flag=false;return;}
    for(int i=n;i!=1;i=fa[i])
    {
        sa[t++]=i;
        if(t>k){flag=false;return ;}
    }

    for(int i=1;i<t;i++)
    {
        int x=sa[i];
        if(vis[x])  continue;
        vis[x]=1;
        dfs(dian+1,depth);
        vis[x]=0;
        if(flag==false) return ;
    }
}

void IDA()
{
    if(n<=2)
    {
        puts("0");
        return ;
    }
    int depth=0;
    flag=true;
    vis[1]=1;
    while(flag)
    {
        dfs(0,depth);
        if(!flag)   break;
        depth++;
    }
    pi1(depth);
}

int main()
{
//    freopen("input.txt","r",stdin);
    while(scanf("%d%d%d",&n,&m,&k)&&(n+m+k))
    {
        mset(lin,0);
        forb(i,0,m)
        {
            int a,b,t;
            si2(a,b);
            t=++lin[a][0];
            lin[a][t]=b;
            //这个地方写双向的就WA了,单向的就A了
        }
        IDA();
    }
    return 0;
}




超时代码:(IDA* + DFS)个人感觉应该差不多,但是就是超时了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <list>
#include <deque>
#include <queue>
#include <iterator>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <cctype>
using namespace std;

#define si1(a) scanf("%d",&a)
#define si2(a,b) scanf("%d%d",&a,&b)
#define sd1(a) scanf("%lf",&a)
#define sd2(a,b) scanf("%lf%lf",&a,&b)
#define ss1(s)  scanf("%s",s)
#define pi1(a)    printf("%d\n",a)
#define pi2(a,b)  printf("%d %d\n",a,b)
#define mset(a,b)   memset(a,b,sizeof(a))
#define forb(i,a,b)   for(int i=a;i<b;i++)
#define ford(i,a,b)   for(int i=a;i<=b;i++)

typedef long long LL;
const int N=1005;
const int M=105;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
const double eps=1e-7;

int n,m,k;
int lin[N][N];//邻接表储存
int cnt[M];//记录从1到n最短路径
bool vis[N];//标记节点是否被删除
int ans,Min;
bool flag;

struct xh
{
    int x,y,next;
}edge[N];

void dfs2(int k,int de)//求最短距离
{
    cnt[de]=k;//路径
    if(k==n)
    {
        Min=min(Min,de);
        return ;
    }

    for(int i=1;i<=lin[k][0];i++)
    {
        int t=lin[k][i];
        if(vis[t])  continue;
        vis[t]=1;
        dfs2(t,de+1);
        vis[t]=0;
    }
}

void dfs1(int dian,int depth)//求去掉最少个数点
{
    if(flag==false) return ;
    Min=INF;
    mset(cnt,0);
    dfs2(1,0);
//    cout<<"最短距离"<<Min<<endl;
//    cout<<"路径:";
//    if(Min!=INF)
//    {
//        for(int i=0;i<=Min;i++)
//            printf("%d ",cnt[i]);
//        cout<<endl;
//    }
//    system("pause");

    int xh=Min;
    if(xh>=k)
    {
        flag=false;
        ans=min(ans,dian);
        return ;
    }
    if(dian>=depth)
        return ;

    int sa[N];
    for(int i=0;i<=xh;i++)
        sa[i]=cnt[i];
    for(int i=1;i<xh;i++)
    {
        int t=sa[i];
        if(vis[t])  continue;
        vis[t]=1;
        dfs1(dian+1,depth);
        vis[t]=0;
        if(flag==false) return ;
    }
}

int main()
{
//    freopen("input.txt","r",stdin);
    while(scanf("%d%d%d",&n,&m,&k)&&(n+m+k))
    {
        mset(lin,0);
        forb(i,0,m)
        {
            int a,b,t;
            si2(a,b);
            t=++lin[a][0];
            lin[a][t]=b;
            t=++lin[b][0];
            lin[b][t]=a;
        }
        ans=INF;
        mset(vis,0);
        vis[1]=1;
        flag=true;
        int depth=-1;
        while(flag)
        {
            depth++;
            dfs1(0,depth);
        }

        pi1(depth);
    }
    return 0;
}


相关文章:

  • 黑马程序员_常用类(System.Math,Calendar,Date,Runtime)
  • 转载 eoe 大神整理好的 android 开源项目
  • (3)选择元素——(17)练习(Exercises)
  • [week4]每周总结与工作计划
  • 每天一道算法_1_放苹果
  • CSS3之渐变Gradient
  • Linux下几个常用的快捷键,真的很实用
  • Python 入门教程 13 ---- Loops
  • 软件开发中的资源控制问题学习
  • linux mount命令学习
  • TCP头分析+面试题
  • Maven--多模块依赖实例解析(五)
  • Python解决codeforces ---- 1
  • HDU 2493 Timer 数学(二分+积分)
  • linux printk函数学习
  • [NodeJS] 关于Buffer
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • AHK 中 = 和 == 等比较运算符的用法
  • Angular 2 DI - IoC DI - 1
  • Consul Config 使用Git做版本控制的实现
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • ES6核心特性
  • HTML5新特性总结
  • JavaScript中的对象个人分享
  • session共享问题解决方案
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 人脸识别最新开发经验demo
  • 写给高年级小学生看的《Bash 指南》
  • 你对linux中grep命令知道多少?
  • mysql面试题分组并合并列
  • ​2021半年盘点,不想你错过的重磅新书
  • #git 撤消对文件的更改
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • (16)Reactor的测试——响应式Spring的道法术器
  • (ZT)薛涌:谈贫说富
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (七)c52学习之旅-中断
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)我也是一只IT小小鸟
  • ./configure、make、make install 命令
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET CLR Hosting 简介
  • .NET6实现破解Modbus poll点表配置文件
  • .Net面试题4
  • .NET企业级应用架构设计系列之结尾篇
  • @EnableAsync和@Async开始异步任务支持
  • @Mapper作用
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [BUUCTF 2018]Online Tool(特详解)
  • [C++]C++入门--引用
  • [CareerCup] 12.3 Test Move Method in a Chess Game 测试象棋游戏中的移动方法
  • [cb]UIGrid+UIStretch的自适应
  • [codevs] 1029 遍历问题