CODEVS 1079回家

来源:互联网 发布:淘宝卖家需要多少钱 编辑:程序博客网 时间:2024/09/21 09:02
#include<stdio.h>#include<iostream>using namespace std;int youniu[55],youdian[55],g[55][55],dis[55],book[55];int mmin,value,v,u,p;char a,b;const int inf = 1000000000;int main(){    freopen("1079.in","r",stdin);    freopen("1079.out","w",stdout);    scanf("%d",&p);    for(int i=1;i<=52;i++)//初始化图        for(int j=1;j<=52;j++)            if(i==j) g[i][j]=0;            else g[i][j]=inf;    for(int i=1;i<=p;i++){        scanf("\n%c %c %d",&a,&b,&value);//注意读入换行符!!!        if(a==b) continue;        if(a=='Z'){//1号是Z,2~26号是A~Y,27~52号是a~z            u=1;        }        else if(a>='A'&&a<'Z'){            u=a-'A'+2;            youniu[u]=1;//大写有牛        }        else if(a>='a'&&a<='z'){            u=a-'a'+1+26;            youniu[u]=0;//小写没牛        }        if(b=='Z'){            v=1;        }        else if(b>='A'&&b<'Z'){            v=b-'A'+2;            youniu[v]=1;//大写有牛        }        else if(b>='a'&&b<='z'){            v=b-'a'+1+26;            youniu[v]=0;//小写没牛        }        youdian[u]=1;//有点        youdian[v]=1;//有点        if(g[u][v]<=value||g[v][u]<=value) continue;        else{//无向图!无向图!无向图!IMPORTANT THINGS SAY THREE TIMES!!!            g[u][v]=value;            g[v][u]=value;        }     }    dis[1]=0;    for(int i=1;i<=52;i++)//初始化dis        if(youdian[i]==1) dis[i]=g[1][i];        else  dis[i]=inf;    for(int i=1;i<=52;i++)        book[i]=0;    book[1]=1;    //下面是Dijkstra    for(int i=1;i<=52;i++){//遍历全部的点        if(youdian[i]!=1) continue;//确保该点存在        mmin=inf;        for(int j=1;j<=52;j++){//找出dis值最小的节点u            if(book[j]==0&&dis[j]<mmin){                mmin=dis[j];                u=j;            }        }        book[u]=1;//找到了就标记为找到了        for(v=1;v<=52;v++){            if(youdian[i]!=1) continue;            if(g[u][v]<inf){//从u到v                if(dis[v]>dis[u]+g[u][v])                    dis[v]=dis[u]+g[u][v];            }        }    }    mmin=inf;    for(int i=1;i<=52;i++){        if(youniu[i]==1){            if(dis[i]<mmin){                mmin=dis[i];                u=i;            }        }    }    //调试/*for(int i=1;i<=52;i++){        cout<<dis[i]<<"\n";     }    for(int i=1;i<=52;i++){        for(int j=1;j<=52;j++)            if(g[i][j]<inf) printf("%d ",g[i][j]);            else printf("inff ");        printf("\n");       }*/    printf("%c %d",u-2+'A',mmin);//输出位置肯定为大写字母!    return 0;}

题解:使用邻接矩阵的Dijkstra,数据在读入方面加强了难度,而并未在数据的时间复杂度上增难,所以邻接矩阵可不超时。
原因:全图最多52个节点而数据最大的边的数量为10000,所以该图不是一个稀疏图,使用邻接表、堆、优先队列的做法并不讨巧。

0 0
原创粉丝点击