A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 善良的禽兽 中级黑马   /  2015-9-28 22:54  /  303 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


#include "cstdio"
#include "cmath"
#include "fstream"
#include "cstring"
#include "algorithm"
#include "iostream"
#include "vector"
#include "queue"
#include "stack"
#include "set"
#include "map"
#define lson root<<1
#define rson root<<1|1
#define lowbit(i) i&(-i)
#define debug(x) cout<<#x<<"="<<x<<endl;
#define here cout<<endl<<"_______________here "<<endl;
#define INF 0x7f7f7f7f
#define LINF 0x7f7f7f7f7f7f7f7f
#define Prime 999983
#define N 100050
using namespace std;
  
bool visited[N];
int cost[3][10];
int cc[N], cs[N];
int tcost, step;

void SPFA(int early, int goal)
{
     int cur, tmp;
     queue<int>q;
     memset(cc, 9999, sizeof(cc));
     memset(cs, 9999, sizeof(cs));
     memset(visited, true, sizeof(visited));
      
     cc[early] = cs[early] = 0;
     q.push(early); visited[early] = false;
      
     while(!q.empty())
     {
            cur = q.front(); q.pop();
           visited[cur] = true;
           
           for(int i = 0; i < 3; i++)
           {
                for(int j = 0; j < 10; j++)
                {
                      if(i == 0)
                           tmp = cur * 10 + j;
                      if(i == 1)
                           tmp = cur + j;
                      if(i == 2)
                           tmp = cur * j;
            
                      if(tmp > goal) break;
                      if(cc[tmp] > cc[cur] + cost[j])
                      {
                             cc[tmp] = cc[cur] + cost[j];
                             cs[tmp] = cs[cur] + 1;
                             if(visited[tmp])
                             {
                                   visited[tmp] = false;
                                   q.push(tmp);
                             }
                      }
                }
           }
     }
}

int main()
{
    int t(1), early, goal;
    while(~scanf("%d%d", &early, &goal))
    {
          for(int i = 0; i < 3; i++)
            for(int j = 0; j < 10; j++)
                  scanf("%d", &cost[j]);
          SPFA(early, goal);
          printf("Case %d: %d %d\n",t++, cc[goal], cs[goal]);
     
    }
    return 0;


}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马