hdu 1546 Idiomatic Phrases Game

简介: 点击打开链接hdu 1546 思路:最短路+SPFA 分析: 1  只要建好图,然后利用SPFA求解最短路即可。注意字符串的处理 2  定义一个char ch[10]数组,如果给数组的每一个元素值赋值后,还要记得要在最后ch[9]添加‘\0’,表示结束。

点击打开链接hdu 1546


思路:最短路+SPFA
分析:
1  只要建好图,然后利用SPFA求解最短路即可。注意字符串的处理
2  定义一个char ch[10]数组,如果给数组的每一个元素值赋值后,还要记得要在最后ch[9]添加‘\0’,表示结束。就是如果要保存10个元素,那么数组最小要开到11,因为第11个表示‘\0’来表示正常结束。所以数组尽量开大点

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
using namespace std;
#define MAXN 1010
#define INF 0xFFFFFFF

int n;
char str[MAXN][MAXN];
int value[MAXN][MAXN];
int t[MAXN];
int dis[MAXN];
int vis[MAXN];
queue<int>q;

/*初始化*/
void init(){
   int i , j , k , len;    
   char ch1[10], ch2[10];
   for(i = 1 ; i <= n ; i++){
      len = strlen(str[i])-4;
      for(k = 0 ; k < 4 ; k++)
          ch1[k] = str[i][len+k];  
      ch1[4] = '\0';/*末尾加上'\0',表示字符串结束*/
      for(j = 1 ; j <= n ; j++){
         value[i][j] = INF;
         for(k = 0 ; k < 4 ; k++)
            ch2[k]  = str[j][k];
         ch2[4] = '\0';/*末尾加上'\0',表示字符串结束*/
         if(!strcmp(ch1 , ch2))
           value[i][j] = t[i];
      }   
      value[i][i] = 0;
   }
}

/*SPFA*/
void SPFA(){
    memset(vis , 0 , sizeof(vis));
    for(int i = 2 ; i <= n ; i++)
       dis[i] = INF;
    dis[1] = 0;
    vis[1] = 1;
    q.push(1);
    while(!q.empty()){
       int x = q.front();
       q.pop();
       vis[x] = 0;
       for(int i = 1 ; i <= n ; i++){
          if(value[x][i] && dis[i] > dis[x] + value[x][i]){
            dis[i] = dis[x] + value[x][i];
            if(!vis[i]){
               vis[i] = 1;
               q.push(i);
            }
          }
       }
    }
}

int main(){
   while(scanf("%d" , &n) && n){
      for(int i = 1; i <= n ; i++)
         scanf("%d %s" , &t[i] , str[i]);
      init();
      SPFA();
      if(dis[n] != INF)
        printf("%d\n" , dis[n]);
      else
        printf("-1\n");
   }
   return 0;
}



目录
相关文章
|
6月前
|
算法
uva 10891 game of sum
题目链接 详细请参考刘汝佳《算法竞赛入门经典训练指南》 p67
14 0
LeetCode 390. Elimination Game
给定一个从1 到 n 排序的整数列表。 首先,从左到右,从第一个数字开始,每隔一个数字进行删除,直到列表的末尾。 第二步,在剩下的数字中,从右到左,从倒数第一个数字开始,每隔一个数字进行删除,直到列表开头。 我们不断重复这两步,从左到右和从右到左交替进行,直到只剩下一个数字。 返回长度为 n 的列表中,最后剩下的数字。
73 0
LeetCode 390. Elimination Game
|
算法 索引
LeetCode 45. Jump Game II
给定一个非负整数数组,初始位置在索引为0的位置,数组中的每个元素表示该位置的能够跳转的最大部署。目标是以最小跳跃次数到达最后一个位置(索引)。
50 0
LeetCode 45. Jump Game II
|
算法 索引
LeetCode 55. Jump Game
给定一个非负整数数组,您最初定位在数组的第一个索引处。 数组中的每个元素表示该位置的最大跳转长度。 确定您是否能够到达最后一个索引。
72 0
LeetCode 55. Jump Game
|
Java
HDU 5882 Balanced Game
Balanced Game Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 508    Accepted Submission(s): ...
816 0
LeetCode - 45. Jump Game II
45. Jump Game II  Problem's Link  ---------------------------------------------------------------------------- Mean:  给定一个数组a,玩家的初始位置在idx=0,玩家需要到达的位置是idx=a.
919 0