hdu 2112 HDU Today

简介: 点击打开链接hdu 2112 思路:最短路 分析:只要把名字映射成整数,然后利用整数去求解即可。 注意事项: 1 题目中的起点和终点可能相同,这个时候输出0。

点击打开链接hdu 2112


思路:最短路
分析:只要把名字映射成整数,然后利用整数去求解即可。
注意事项:
1 题目中的起点和终点可能相同,这个时候输出0。
2 用map映射的时候用char类型,由于string是个类效率比较低。
3 处理成无向图


代码:

/*SPFA*/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<cstring>
#include<queue>
#include<map>
using namespace std;
#define MAXN 20010
#define INF 0XFFFFFFF

int n , cnt;
int begin , goal;
int first[MAXN] , next[MAXN];
int star[MAXN] , end[MAXN] , value[MAXN];
int dis[MAXN];
queue<int>q;
map<string , int>m;

void init(){
   cnt = 0;
   m.clear();
   for(int i = 1 ; i <= 200 ; i++){
      first[i] = -1;
      next[i] = -1;
   }
}

void SPFA(int s){
   while(!q.empty())
      q.pop();
   int vis[MAXN];
   memset(vis , 0 , sizeof(vis));
   for(int i = 1 ; i <= cnt ; i++)
      dis[i] = INF;
   dis[s] = 0;
   q.push(s);
   vis[s] = 1;
   while(!q.empty()){
       int x = q.front();
       q.pop();
       vis[x] = 0;
       for(int i = first[x] ; i != -1 ; i = next[i]){
          if(dis[end[i]] > dis[x] + value[i]){
             dis[end[i]] = dis[x] + value[i];
             if(!vis[end[i]]){
                vis[end[i]] = 1;
                q.push(end[i]);
             }
          }
       }
   }
}

void input(){
   int a , b , v;
   char str1[200] , str2[200];
   init();
   scanf("%s%s" , str1 , str2);
   /*这里判断是不是相同点*/
   a = m[str1];
   if(!a)
      m[str1] = a = ++cnt;
   b = m[str2];
   if(!b)
      m[str2] = b = ++cnt;
   begin = a;
   goal = b;

   for(int i = 0 ; i < n ; i++){
        scanf("%s%s%d" , str1 , str2 , &v);
        a = m[str1];
        if(!a)
           m[str1] = a = ++cnt;
        b = m[str2];
        if(!b)
           m[str2] = b = ++cnt;
        /*处理成无向图*/
        star[i] = a;
        end[i] = b;
        value[i] = v;
    
        star[i+n] = b;
        end[i+n] = a;
        value[i+n] = v;
          
        next[i] = first[star[i]];
        first[star[i]] = i;
        next[i+n] = first[star[i+n]];
        first[star[i+n]] = i+n;
    }
}

int main(){
   while(scanf("%d" , &n) && n != -1){
         input();
         SPFA(begin);
         if(dis[goal] != INF)
            printf("%d\n" , dis[goal]);
        else
            printf("-1\n");
   } 
   return 0;
}

/*floyd*/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<cstring>
#include<queue>
#include<map>
using namespace std;
#define MAXN 200
#define INF 0xFFFFFFF

int n , star , end , cnt;
long long  dis[MAXN][MAXN];
map<string , int>m;

long long  min(long long a , long long  b){
   return a < b ? a : b;
}

void init(){
   cnt = 0;
   m.clear();
   for(int i = 1 ; i < MAXN ; i++){
      for(int j = 1 ; j < MAXN ; j++){
          if(i == j)
            dis[i][j] = 0;
          else
            dis[i][j] = INF;
      }
   }
}

void floyd(){
   for(int k = 1 ; k <= cnt ; k++){
      for(int i = 1 ; i <= cnt ; i++){
         for(int j = 1 ; j <= cnt ; j++)
            dis[i][j] = min(dis[i][k]+dis[k][j] , dis[i][j]);
      }
   }
}

void input(){
   int a , b , v;
   char str1[MAXN] , str2[MAXN];
   init();
   scanf("%s%s" , str1 , str2);
       
   a = m[str1];
   if(!a)
      m[str1] = a = ++cnt;
   b = m[str2];
   if(!b)
      m[str2] = b = ++cnt;
   star = a;
   end = b;
   
   for(int i = 0 ; i < n ; i++){
        scanf("%s%s%d" , str1 , str2 , &v);
        a = m[str1];
        b = m[str2];
        if(!a)
           m[str1] = a = ++cnt;
        if(!b)
           m[str2] = b = ++cnt;
        if(dis[a][b] > v)
           dis[a][b] = dis[b][a] = v;
    }
}

int main(){
    while(scanf("%d" , &n) && n != -1){
          input();
          floyd();
          if(dis[star][end] != INF)
             printf("%d\n" , dis[star][end]);
          else
             printf("-1\n");
    }
    return 0;
}


目录
相关文章
|
10月前
|
存储 搜索推荐 关系型数据库
ElasticSearch 详解
ElasticSearch 是一款优秀的开源搜索引擎,适用于大数据场景下的高效检索与分析。其分布式架构、实时搜索和灵活的数据分析功能使其能处理 PB 级数据量。相比 Solr,ES 在实时性、分布式架构和文档处理上更具优势。核心概念包括索引、文档、分片和副本等。ES 使用倒排索引实现快速搜索,区别于正向索引。与关系型数据库相比,ES 更适合非结构化数据和全文搜索。总结来说,ES 在电商搜索、日志分析等领域有广泛应用,未来有望带来更多创新。
504 19
|
存储 分布式计算 资源调度
|
弹性计算 固态存储 双11
阿里云服务器收费标准、价格计算器使用及活动报价查询介绍
本文主要介绍了阿里云服务器实例、带宽、块存储收费标准如何查询,云服务器价格计算器如何使用以及阿里云服务器最新活动报价查询的内容,帮助用户对阿里云服务器的价格情况有一个完成的了解。
1539 0
阿里云服务器收费标准、价格计算器使用及活动报价查询介绍
|
Java Linux 应用服务中间件
1个非常实用的找影视片段的工具神器,赶紧来白嫖!
只需要输入对应的关键词,就能快速找到大量的相关素材,从而大大缩短了我们的搜集时间。
3030 0
1个非常实用的找影视片段的工具神器,赶紧来白嫖!
|
前端开发
css怎么分别设置4个圆角?
css怎么分别设置4个圆角?
2024 0
css怎么分别设置4个圆角?
|
编解码 弹性计算 网络虚拟化
一群阿里人如何用 10 年自研洛神云网络平台,技术架构演进全揭秘
本文主要介绍阿里云网络产品从无到规模应用的 10 年过程中,云网络技术平台洛神的发展历程。
5627 2
一群阿里人如何用 10 年自研洛神云网络平台,技术架构演进全揭秘
|
程序员 Linux Android开发
Py之Kivy:Python库之Kivy的简介、安装、使用方法之详细攻略
Py之Kivy:Python库之Kivy的简介、安装、使用方法之详细攻略
Py之Kivy:Python库之Kivy的简介、安装、使用方法之详细攻略
|
弹性计算 Kubernetes 算法