USACO-Bessie Come Home

来源:互联网 发布:手机淘宝怎样添加好友 编辑:程序博客网 时间:2024/05/22 00:29

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

图论水题

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

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

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

/*ID:ay27272PROG:comehomeLANG:C++*/#include <cstring>#include <cstdio>#include <string>using namespace std;#define INF 168430090#define NN 55int 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;}