Sicily 1700. Ping

Sicily 1700. Ping

训练的题目

最短路变形

题意:这个题意,太长了,总结回来只有两三句话。输入n表示n个点,从0到n-1,输入m表示m条无向边,输入t,表示终点。要你求起点0到终点t的最短路,不过要先满足一个条件,就是路径的点数不超过10个(包括起点和终点在内 <= 10),如果在10个点内娶不到或者图根本不连通,那么输出no,否则输出最短路

又是一个加了限制的最短路,是要先满足10个点以内再求最短路的,训练的时候就是看错了一直WA。

这题和   poj 1724 ROADS  是一样的题目。可以看作每条边的花费是1点数,你从0出发,手上有9点数,在点数够用的情况下走到终点t的最短路

因此仿照poj这题的代码,写了一个dp,就过了,再仿照写了个bfs搜索,也过了 , 在仿照写了个优先队列+dij , 得到一个MLE,这个是为什么?其实还没想清楚,应该是入队的元素太多(没有加以限制)导致爆了空间,poj那题是100个点,给了64m,这题是1000个点,给了32m,应该是这样了

 

后来上网找到了唯一一个代码,作者的代码写得比我好啊,简单,易懂,附上地址  

http://soj.me/viewsource.php?sid=1796545

 

1.dp的代码

#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
#define N 1010
#define INF 0x3f3f3f3f
const int lim = 9;

typedef pair<int,int>pii;
vector<pii>e[N];
int d[N][15];

void dfs(int u , int c)
{
   if(d[u][c] != -1) return ;
   d[u][c] = INF;
   int size = e[u].size();
   for(int i=0; i<size; i++)
   {
      pii temp = e[u][i];
      int v = temp.first;
      int w = temp.second;
      if(c-1 >= 0)
      {
         dfs(v,c-1);
         if(d[v][c-1] + w < d[u][c])
            d[u][c] = d[v][c-1] + w;
      }
   }
}

int main()
{
   int n,m,t;
   while(scanf("%d%d%d",&n,&m,&t)!=EOF && n)
   {
      for(int i=0; i<n; i++) e[i].clear();
      while(m--)
      {
         int u,v,w;
         scanf("%d%d%d",&u,&v,&w);
         e[u].push_back( make_pair(v,w) );
         e[v].push_back( make_pair(u,w) );
      }

      memset(d,-1,sizeof(d));
      for(int i=0; i<=lim; i++) d[0][i] = 0;
      int res = INF;
      for(int i=0; i<=lim; i++)
      {
         dfs(t,i);
         if(d[t][i] < res) res = d[t][i];
      }
      if(res == INF) printf("no\n");
      else           printf("%d\n",res);
   }
   return 0;
}

 

 

2.bfs搜索,彻底搜索更新所有状态

#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
#define N 1010
#define INF 0x3f3f3f3f
const int lim = 9;

typedef pair<int,int>pii;
vector<pii>e[N];
int d[N][15];

void bfs(int s , int t)
{
   bool inq[N];
   queue<int>q;
   while(!q.empty()) q.pop();
   memset(inq,false,sizeof(inq));
   memset(d,0x3f,sizeof(d));
   for(int i=0; i<=lim; i++) d[s][i]=0;
   inq[s] = true;
   q.push(s);

   while(!q.empty())
   {
      int u = q.front();
      q.pop();
      inq[u] = false;
      int size = e[u].size();
      for(int i=0; i<size; i++)
      {
         pii temp = e[u][i];
         int v = temp.first;
         int w = temp.second;
         int c = 1;
         for(int j=1; j<=lim; j++)
            if(d[u][j-c] + w < d[v][j])
            {
               d[v][j] = d[u][j-c] + w;
               if(!inq[v])
               {
                  inq[v] = true;
                  q.push(v);
               }
            }
      }
   }

   int res = INF;
   for(int i=0; i<=lim; i++)
      if(d[t][i] < res)
         res = d[t][i];
   if(res == INF) printf("no\n");
   else           printf("%d\n",res);
}

int main()
{
   int n,m,t;
   while(scanf("%d%d%d",&n,&m,&t)!=EOF && n)
   {
      for(int i=0; i<n; i++) e[i].clear();
      while(m--)
      {
         int u,v,w;
         scanf("%d%d%d",&u,&v,&w);
         e[u].push_back( make_pair(v,w) );
         e[v].push_back( make_pair(u,w) );
      }
      bfs(0,t);
   }
}

 

3.网上找到的代码

#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
#define N 1010
#define INF 0x3f3f3f3f
const int lim = 9;

typedef pair<int,int>pii;
vector<pii>e[N];
int d[N];
int len[N];

void bfs(int s , int t)
{
   bool inq[N];
   queue<int>q;
   while(!q.empty()) q.pop();
   memset(inq,false,sizeof(inq));
   memset(d,0x3f,sizeof(d));
   memset(len,0,sizeof(len));
   d[s] = 0;
   inq[s] = true;
   q.push(s);

   while(!q.empty())
   {
      int u =q.front();
      q.pop();
      inq[u] = false;
      int size = e[u].size();
      for(int i=0; i<size; i++)
      {
         pii temp = e[u][i];
         int v = temp.first;
         int w = temp.second;
         int c = 1;
         if(d[u] + w < d[v])
         {
            d[v] = d[u] + w;
            len[v] = len[u] + c;
            if(len[v] <= lim) q.push(v);
         }
      }
   }

   if(d[t] == INF) printf("no\n");
   else            printf("%d\n",d[t]);
}

int main()
{
   int n,m,t;
   while(scanf("%d%d%d",&n,&m,&t)!=EOF && n)
   {
      for(int i=0; i<n; i++) e[i].clear();
      while(m--)
      {
         int u,v,w;
         scanf("%d%d%d",&u,&v,&w);
         e[u].push_back( make_pair(v,w) );
         e[v].push_back( make_pair(u,w) );
      }
      bfs(0,t);
   }
}

 

转载于:https://www.cnblogs.com/scau20110726/archive/2013/04/30/3052358.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/110145.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Pytorch实现基于卷积神经网络的面部表情识别(详细步骤)「建议收藏」

    Pytorch实现基于卷积神经网络的面部表情识别(详细步骤)「建议收藏」文章目录一、项目背景二、数据处理1、标签与特征分离2、数据可视化3、训练集和测试集三、模型搭建四、模型训练特征五、完整代码一、项目背景数据集cnn_train.csv包含人类面部表情的图片的label和feature。在这里,面部表情识别相当于一个分类问题,共有7个类别。其中label包括7种类型表情:一共有28709个label,说明包含了28709张表情包嘿嘿。每一行就是一张表情包4848=2304个像素,相当于4848个灰度值(intensity)(0为黑,255为白)二、数据处理

    2022年5月16日
    67
  • Git–Submodule使用

    Git–Submodule使用

    2022年1月6日
    42
  • 上海市高校计算机考试准考证

    上海市高校计算机考试准考证大家好啊,距离22考研初试仅剩26天,现在这个时候,大家除了对知识点进行查缺补漏之外,也得关注一些关于考前的准备工作,还有考场的注意事项哦!因为地区的不同,考点的不同,监考老师的不同,考试的要求和规定也会有差异哦,所以大家在拿到准考证之后,一定要仔细查看考试考点的要求~#考研倒计时#打开腾讯新闻,查看更多图片>1、可不可以戴手表、手环?如果要戴手表,那必须是没有记忆及计算功能的,也就是机械表,手环算电子产品大概率是不可以带的,在进考场之前可以询问一下监考老师,确认一下是否可以带

    2022年5月7日
    63
  • TortoiseGit Couldn’t load this key(unable to open file)

    很小的问题,记录一下!在使用TortoiseGit 配置了ppk后,有一个Git仓库每次更新的时候都会提示下面的错误! Couldn’t load this key(unable to open file)如图:解决办法: 在对应的仓库下面右键 ,看到如下 , TortoiseGit_Gen_GitHub.ppk是我之前生成的,后来这个ppk删掉了,而…

    2022年2月27日
    47
  • python和pycharm以及anaconda的安装顺序_症证病三者之间区别

    python和pycharm以及anaconda的安装顺序_症证病三者之间区别1、致欢迎词我将详细讲述在学Python初期的各种手忙脚乱的问题的解决,通过这些步骤的操作,让你的注意力集中在Python的语法上以及后面利用Python所解决的项目问题上。而我自己作为小白,很不幸的没有错过任何的坑,都跳了进去,所以在这里写下经验贴,一方面希望能给后来的学者能够高效的避开这些坑,另一方面也算是自己的总结与警告。2、内容大纲2.1安装顺序能够使用Python的安装…

    2022年8月28日
    0
  • 网络游戏开发基础篇

    本篇的内容,会介绍几个内容:单例,dll动态加载以及一些跨平台的处理。       1、单例:单例模式是一种使用广泛而又比较简单的设计模式,他的定义我就不多介绍了,大家上网一查就知道了,基本都能理解。在游戏开发中,会有很多单件,所以封装一个单例类供后面的开发使用。       本单例使用模板实现,代码如下:[cpp] viewplaincopyprint?//

    2022年4月5日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号