回家(洛谷 P1592)

模板题。。

传送门:codevs 1079

 

 

思路 :以 Z 为起点 直接跑一边SPFA , 看哪一头母牛距离Z点最近 , 最后找出Z 到 A~Y 的最短路 (因为仅有A~Z有奶牛)

 

#include <iostream>
#include <cstdio>
#include <cstring>
#define Max 300000
#define INF 100000000
using namespace std;
int N, Count;
int head [Max], dis [Max], queue [Max];
bool visit [Max];
struct node 
{
    int to;
    int dis;
    int next;
}Edge [Max];
void AddEdge (int x, int y, int w)
{
    Count++;
    Edge [Count].to = y;
    Edge [Count].dis = w;
    Edge [Count].next = head [x];
    head [x] = Count;
}
void SPFA (int start)
{
    int head_cur = 0, tail_cur = 1;
    for (int i = 1; i <= 123; i++)
    {
        dis [i] = INF;
        visit [i] = false;
    }
    dis [start] = 0;
    queue [1] = start;
    while (head_cur <= tail_cur)
    {
        head_cur++;
        int now = queue [head_cur];
        for (int i = head [now]; i; i = Edge [i].next)
            if (dis [now] + Edge[i].dis < dis [Edge [i].to])
            {
                dis [Edge [i].to] = dis [now] + Edge[i].dis ;
                if (visit [Edge[i].to ] == false)
                {
                    queue [++tail_cur] = Edge [i].to;
                    visit [Edge[i].to ] = true;
                }
            }
        visit [now] = false;
    }
}
int main()
{
    ios :: sync_with_stdio (false);
    cin >> N;
    char x, y; 
    int w;
    for (int i = 1; i <= N; i++)
    {
        cin >> x >> y >> w;
        AddEdge ((int) (x), (int) (y), w);   //直接用 字母 的Ascll 码 作为节点即可 
        AddEdge ((int) (y), (int) (x), w);
    }
    SPFA ((int)'Z');
    int flag, Maxn = INF;
    for (int i = 'A'; i <= 'Y'; i++)  //因为只有A ~ Y 有母牛,所以只需查找这些点即可  
    {
        if (dis [i] < Maxn)  
        {
            Maxn = dis [i];   
            flag = i;    //找出距离最短的点 
        }
    }
    cout << (char)flag << " " << dis [flag]; 
    return 0;
}

 

转载于:https://www.cnblogs.com/ZlycerQan/p/6063282.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值