hdu 2112 HDU Today

点击打开链接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;
}
时间: 2024-10-26 22:37:17

hdu 2112 HDU Today的相关文章

最短路专题【完结】

第一题 hdu 1317 XYZZY 点击打开hdu 1317 思路: 1 题目的图是一个有向图,并且可能存在环.第一个点的能量值为100,边的权值利用能量大小,例如2点为-60,如果1->2那么value[1][2] = -602 题目明确指出如果是要win的话,那么必须是经过的每条边都要大于0.那么我们只要把那些经过松弛操作后的点大于0的入队即可,小于等于0的点肯定不会出现在最终的路径上.3 如果存在正环的话,那么就有能量值无限大,那么这个时候只要判断这个点能否到达n4 判断是否是有环还是五

HDU 3339 In Action:最短路+背包

链接: http://acm.hdu.edu.cn/showproblem.php?pid=3339 题目: Problem Description Since 1945, when the first nuclear bomb was exploded by the Manhattan Project team in the US, the number of nuclear weapons have soared across the globe. Nowadays,the crazy bo

【DP专辑】ACM动态规划总结

转载请注明出处,谢谢.   http://blog.csdn.net/cc_again?viewmode=list          ----------  Accagain  2014年5月15日 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. 本人动态规划博客地址:http://blog.csdn.net/cc_again/article/category/1261899 ******************

hdu 1757 A Simple Math Problem

点击此处即可传送到hdu 1757 **A Simple Math Problem** Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3497 Accepted Submission(s): 2112 Problem Description Lele now is thinking about a simple function f(x).

hdu 1527

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1527 hint:威佐夫博弈 基本类似于模板 #include <iostream> #include <cmath> #include <cstdio> using namespace std; const double q = (1 + sqrt(5.0)) / 2.0; // 黄金分割数 int Wythoff(int a, int b) { if (a > b)

hdu 2551 竹青遍野

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2551 hint:就是读懂题就行了 #include <iostream> #include <cstdio> using namespace std; typedef long long LL; LL data[1005]; int main() { data[0]=0; for(int i=1; i<1005; i++) data[i]+=data[i-1]+i*i*i; LL

hdu 2054 A == B?

http://acm.hdu.edu.cn/showproblem.php?pid=2054 此题巨坑,刚开始我以为是简单的水题,就用strcmp过, but错了,后来经过我苦思冥想,结果还有几组数据 0.0 和 0,1.000和1.0 , 但是我不太确定前面的0是不是有作用我还是写了,但是有人过的时候,前面的0没考虑比如: 002和2可能是相等的,也可能是不想等的所以不用判断,只能说明hdu数据不是很强啊,嘿嘿 代码如下: #include <iostream> #include <c

hdu 4430 Yukari&#039;s Birthday

点击打开链接hdu 4430 思路:枚举r+二分k 分析: 1 题目要求的是找到一组最小的r*k,如果r*k相同那么就找r最小的. 2 很明显k>=2,根据n <= 10^12,那么可以知道r的最大值r<50,所以只要枚举枚举r的值,然后二分k的大小找到所有的解,存入一个结构体里面,然后在对结构体排序,那么这样就可以得到最后的ans 3 注意题目说了中心点最多一个蜡烛,所以写二分的时候应该注意判断的条件: 4 还有可能计算得到结果超了long long直接变成负数所以应该对或则个进行判断

hdu 1238 Substrings

点击打开链接hdu 1238 思路:kmp+暴力枚举子串 分析: 1 题目要求找到一个子串x,满足x或x的逆串是输入的n个字符串的子串,求最大的x,输出x的长度 2 题目的n最大100,每一个字符串的最大长度为100,那么暴力枚举子串就是o(n^2)才10000肯定是不会超时的,但是由于这里涉及到了逆串的问题,所以我们应该还要求出n个子串的逆串,然后在求最大的x. 代码: #include<iostream> #include<algorithm> #include<cstd