USACOBessie Come Home

来源:http://ace.delos.com/usacoprob2?a=aazEDPQYeki&S=comehome

图论水题

主要注意下题目的条件就行了。

注意a和A可以同时出现,因为边数最大是10000,所以边必有重复给出的。

其他的没什么特别的,dijkstra模板秒杀

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

#include <cstring>
#include <cstdio>
#include <string>
using namespace std;

#define INF 168430090
#define NN 55

int map[NN][NN];
int d[NN];
bool f[NN];
int n;
bool done[NN];


void dijkstra(int s)      //dijkstra模板
{
    memset(d,10,sizeof(d));
    memset(done,0,sizeof(done));

    for (int i=1;i<NN;i++)
        if (f[i]) d[i]=map[s][i];
    d[s]=0;
    done[s]=true;
    int minn,k;

    for (int i=1;i<NN;i++)
    {
        minn=INF;
        for (int j=1;j<NN;j++)
        if (!done[j] && d[j]<minn && f[j])
            minn=d[k=j];
        done[k]=true;
        for (int j=1;j<NN;j++)
            if (f[j] && d[j]>d[k]+map[k][j])
                d[j]=d[k]+map[k][j];
    }
}

char uppercase(char c)    //没找到C++中的相应函数,只能自己写了
{
    if ('A'<=c && c<='Z') return c;
    else return (c-'a'+'A');
}

int main()
{
    freopen("comehome.in","r",stdin);
    freopen("comehome.out","w",stdout);
    memset(f,0,sizeof(f));
    memset(map,10,sizeof(map));
    char c1,c2;
    int u,v,dd;

    scanf("%d\n",&n);
    for (int i=1;i<=n;i++)
    {
        scanf("%c %c %d\n",&c1,&c2,&dd);   //大写的存在1-26,小写存在27-52
        if (islower(c1)) u=27+c1-'a';
        else u=c1-'A'+1;
        if (islower(c2)) v=27+c2-'a';
        else v=c2-'A'+1;
        f[u]=f[v]=true;
        map[u][v]=map[v][u]=min(map[u][v],dd);
    }

    dijkstra(26);

    int minn=INF,k;
    for (int i=1;i<26;i++)
    if (f[i] && d[i]<minn)
        minn=d[k=i];
    printf("%c %d\n",k+'A'-1,minn);
    return 0;
}
原文地址:https://www.cnblogs.com/ay27/p/2785450.html