hdu2680 choose the best route

题目

题意:给定一个有向图,多个起点,一个终点,求起点到终点的最短路。

这道题TLE了好多次,两侧次的对比主要在于对起点的处理上,法一:最开始是采用的hdu2066——一个人的旅行,这道题的方法做的,发现总是TLE。

法二:然后看别人的博客:再加上一个点作为起点,编号为0,这个点和题中给的那些起点之间的距离为0。这样题目就转化为了求单源最短路径问题。

当时我觉得这两种做法没有什么不同,结果我错了。法一:每个起点都要去运行一边 Dijkstra算法,而法二:只用运行一次Dijkstra算法,所以法一总是超时。

接下来给出两次的代码:

法一:

 

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
const int Max = 1010;
const int INF = 0xFFFFFFF;
int value[Max][Max];
int vis[Max];
int dis[Max];
int s[Max];
int T,S,D;
void init(){
   for(int i = 1 ; i <= T ; i++){
      for(int j = 1 ; j <= T ; j++)
        value[i][j] = INF;//初始化点与点之间的距离
   }
}
void Dijkstra(int s)
{
    int pos;//?
	int i,j;
    memset(vis,0,sizeof(vis));
    for( i=1;i<=T;i++)
        dis[i]=INF;
        dis[s]=0;
    for( i = 1;i<=T;i++)
    {
        pos = -1;
        for( j=1;j<=T;j++)
        {
            if(!vis[j]&&(pos==-1||dis[j]<dis[pos]))
                pos=j;//?
        }
        if(pos == -1)
            break;
        vis[pos]=1;
        for( j=1;j<=T;j++)
        {
            if(!vis[j]&&dis[j]>dis[pos]+value[pos][j])
                dis[j]=dis[pos]+value[pos][j];
        }
    }
}
int main()
{

    int a,b,v,ans,i;

    while(~scanf("%d%d%d",&T,&S,&D))
    {
        init();	
	
		memset(s,0,sizeof(s));
       // for(int i=1;i<=T;i++)
        //    v[i]=i;
        for( i=0; i<S; i++)
        {
            scanf("%d%d%d",&a,&b,&v);
            if(value[a][b] > v)  //要是有相同边,保存最短的边
            value[a][b]=v;
        }
        int w;
        scanf("%d",&w);
        for( i=0;i<w;i++)
            scanf("%d",&s[i]);

        //枚举
        ans = INF;
        for( i=0;i<w;i++)
        {
            Dijkstra(s[i]);

                ans = ans<dis[D]? ans : dis[D];
        }
       if(ans!=INF)
            printf("%d\n",ans);
        else
            printf("-1\n");
    }
    return 0;
}


法二:

 

 

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
const int Max = 1010;
const int INF = 0xFFFFFFF;
int value[Max][Max];
int vis[Max];
int dis[Max];
int T,S,D;
void init(){
   for(int i = 0 ; i <= T ; i++){
      for(int j = 0 ; j <= T ; j++)
        value[i][j] = INF;//初始化点与点之间的距离
   }
}
void Dijkstra(int s)
{
    int pos;//?
	int i,j;
    memset(vis,0,sizeof(vis));
    for( i=0;i<=T;i++)
        dis[i]=INF;
        dis[s]=0;
    for( i = 0;i<=T;i++)
    {
        pos = -1;
        for( j=0;j<=T;j++)
        {
            if(!vis[j]&&(pos==-1||dis[j]<dis[pos]))
                pos=j;//?
        }
        if(pos == -1)
            break;
        vis[pos]=1;
        for( j=0;j<=T;j++)
        {
            if(!vis[j]&&dis[j]>dis[pos]+value[pos][j])
                dis[j]=dis[pos]+value[pos][j];
        }
    }
}
int main()
{

    int a,b,v,i;
    int s;
    while(~scanf("%d%d%d",&T,&S,&D))
    {
        init();
        for( i=0; i<S; i++)
        {
            scanf("%d%d%d",&a,&b,&v);
            if(value[a][b] > v)  //要是有相同边保存最短的边
            value[a][b]=v;
        }
        int w;
        scanf("%d",&w);
        for(i=0;i<w;i++)
        {
            scanf("%d",&s);
            value[0][s]=0;
        }
            Dijkstra(0);
       if(dis[D]!=INF)
            printf("%d\n",dis[D]);
        else
            printf("-1\n");
    }
    return 0;
}

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值