hdu 1874 (最短路)

/*
 同样的代码稍微修改下交2112 就是错的,为何最近总是碰到这么奇怪的事情??
 第一次写map hash
*/

#include <iostream>//2563607 2010-06-30 18:13:26 Accepted 1874 46MS 4292K 1720 B C++ 悔惜晟
#include <map>
#include <cstdio>
#include <string>
using namespace std;

const int N = 1008;
const int MAX = 0x3fffffff;
int dis[N];
int cost[N][N];
bool hash[N];
map<string, int> df;

void Dijsktra(int len, string s, string end)
{
 int i, j, k;
 for(i = 1; i < len; i++)
 {
  dis[i] = cost[df[s]][i];
 }
 //printf("%d==/n",len);
 memset(hash, false, sizeof(hash));
 hash[df[s]] = true;
 dis[df[s]] = 0;
 for(i = 2; i < len; i++)
 {
  int d = MAX;
  k = df[s];
  for(j = 1; j < len; j++)
  if(!hash[j] && d > dis[j])
  {
   k = j;
   d = dis[j];
  }
  hash[k] = true;
  for(j = 1; j < len; j++)
  if(!hash[j] && dis[j] > dis[k] + cost[k][j])
   dis[j] = dis[k] + cost[k][j];
     
 }
 if(dis[df[end]] != MAX)
  cout<<dis[df[end]]<<endl;
 else
  cout<<"-1"<<endl;
}

int main()
{
 int i, j, len, n, m, t;
 string ss, en;
 string start, end;
 
 while(cin>>m>>n && n != -1)
 {
  len = 1;
 
  for(i = 0; i < N; i++)
  for(j = 0; j < N; j++)
  {
   cost[i][j] = MAX;
  }
  for(i = 0; i < n; i++)
  {
   cin>>ss>>en>>t;
   if(!(df[ss]))
   {
    df[ss] = len;
    len++;
    //printf("%d===/n", len);
   }
   if(!(df[en] ))
   {
    df[en] = len;
    len++;
    //printf("%d===/n", len);
   }
   //cout<<len<<endl;
   //printf("%d %d/n", df[ss], df[en]);
   if (t < cost[df[ss]][df[en]])
   {
    cost[df[ss]][df[en]] = t;
    cost[df[en]][df[ss]] = t;
   }
  }
  cin>>ss>>en;
  if(!(df[ss]))
  {
   df[ss] = len;
   len++;
   //printf("%d===/n", len);
  }
  if(!(df[en] ))
  {
   df[en] = len;
   len++;
   //printf("%d===/n", len);
  }
  //cout<<len<<endl;
  Dijsktra(len, ss, en);
  df.clear();
 }
 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值