USACO 2.4 Bessie Come Home (comehome)

本文介绍了一个使用迪杰斯特拉算法求解从指定起点到其它各点最短路径的问题实例。通过C++实现,从一个特定点出发找到到达其他牧场的最短路径,并从中选择一条从A到Y的最短路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//Main idea
//Calculate the shortest path from 'Z' to ohter pastures by  Dijkstra algorithm;
//And then choose shortest path among 'A' to 'Y';

/*
ID: haolink1
PROG: comehome
LANG: C++
*/

//#include <iostream>
#include <fstream>

const int INF = 52 * 1000 + 1;
int min_path[52];
bool is_remove[52];
int dist[52][52];
using namespace std;

bool IsCapital(char x){
    if(x >= 'A' && x <= 'Z')
        return true;
    else return false;
}

int ExtractMin(){
    int min_index = -1;
    int min = INF; 
    for(int i = 0; i < 52; i++){
        if(min > min_path[i] && is_remove[i] == 0){
            min = min_path[i];
            min_index = i;
        }
    }
    if(min_index >= 0)
        is_remove[min_index] =1;
    return min_index;
}

void Relax(int x,int y){
    if(min_path[y] > min_path[x] + dist[x][y])
        min_path[y] = min_path[x] + dist[x][y];
}

void Dijkstra(){
    for(short i = 0; i < 52; i++){
        min_path[i] = INF;
    }
    min_path[25] = 0;
    while(1){
        int index = ExtractMin();
        if(index < 0)
            break;
        for(int i = 0; i < 52; i++){
            if(dist[index][i] < INF ){
                Relax(index,i); 
            }
        }
    }
}

int main(){
    for(short i = 0; i < 52; i++ ){
        for(short j = 0; j < 52; j++){
            dist[i][j] = INF;//Note dist[i][i] is also INF and it will be used in Dijkstra;
        }
    }
    int num = 0;
    ifstream fin("comehome.in");
    fin >> num;
    for(int i = 0; i < num; i++){
        int x, y;
        char x_char,y_char;
        int dis;
        fin >> x_char >> y_char >> dis;
        if(IsCapital(x_char)){
           x = x_char-'A';
        }else
            x = x_char - 'a' + 26;
        if(IsCapital(y_char))
            y = y_char-'A';
        else
            y = y_char- 'a' + 26;
        if(dis < dist[x][y] && x != y)//For each path between two pastures, we only take the shortest;
            dist[x][y] = dist[y][x] = dis;
    }
    Dijkstra();
    int min = INF;
    int index = -1;
    for(int i = 0; i < 25; i++){
        if(min_path[i] < min){
            min = min_path[i];
            index = i;
        }
    }
    char cow = 'A' + index;
    ofstream fout("comehome.out");
    fout << cow <<" "<< min << endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值