zoukankan      html  css  js  c++  java
  • hdu 2112 HDU Today (最短路,字符处理)

    题目

    题目很简单,只是多了对地名转化为数字的处理,好吧,这我也是参考网上的处理办法,不过大多数的人采用map来处理

    注意初始化注意范围,不然会wa!!!(这是我当时wa的原因org)

    大家容易忽视的地方——双向边,起点等于终点(虽然我当时都考虑到了)

    #define  _CRT_SECURE_NO_WARNINGS
    
    #include<string.h>
    #include<stdio.h>
    #include<math.h>
    
    const int MAXN=155;  
    
    #define typec int  
    const typec INF=0x3f3f3f3f;//防止后面溢出,这个不能太大  
    bool vis[MAXN];  
    int pre[MAXN];
    typec cost[MAXN][MAXN];
    typec lowcost[MAXN];
    int nn;
    char mark[MAXN][33];
    void Dijkstra(int n,int beg)  
    {  
        lowcost[beg]=0;  
        for(int j=0;j<n;j++)  
        {  
            int k=-1;  
            int Min=INF;  
            for(int i=0;i<n;i++)  
                if(!vis[i]&&lowcost[i]<Min)  
                {  
                    Min=lowcost[i];  
                    k=i;  
                }  
            if(k==-1)break;  
            vis[k]=true;  
            for(int i=0;i<n;i++)  
                if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i])  
                {  
                    lowcost[i]=lowcost[k]+cost[k][i];  
                    pre[i]=k;  
                }  
        }  
    }  
    
    int find(char ch[])//灵感来自网上
    {
        for(int i=0;i<nn;i++)
        {
            if(strcmp(mark[i],ch)==0)    //有出现过
                return i;
        }
        strcpy(mark[nn],ch);//出现新的记录一下
        nn++;
        return nn-1;
    }
    
    int main()
    {
        int n,i,c,j,aa,bb,ee,ss;
        char a[33],b[33],s[33],e[33];
        while(scanf("%d",&n)!=EOF)
        {
            if(n==-1)break;
            nn=0;
            for(i=0;i<MAXN;i++)
            {
                mark[i][0]='';
                lowcost[i]=INF;
                vis[i]=false;pre[i]=-1; 
                for(j=0;j<MAXN;j++)
                    cost[i][j]=(i==j)? 0:INF;
            }
            scanf("%s%s",s,e);
            ss=find(s);
            ee=find(e);
            for(i=0;i<n;i++)
            {
                scanf("%s%s%d",a,b,&c);
                aa=find(a);
                bb=find(b);
                if(cost[aa][bb]>c)
                    cost[aa][bb]=cost[bb][aa]=c;
            }
            Dijkstra(nn,ss);
            if(lowcost[ee]>=INF)
                lowcost[ee]=-1;
            if(strcmp(s,e)==0)
                printf("0
    ");
            else
            printf("%d
    ",lowcost[ee]);
        }
        return 0;
    }
    View Code
    一道又一道,好高兴!
  • 相关阅读:
    Erlang学习笔记2
    erlang的Socket参数含义
    Erlang 日期和时间处理、时间戳转换
    图(有向)-拓扑排序
    图(无向连通无权图)-广度优先搜索
    图(无向连通无权图)-深度优先搜索
    图(无向连通无权值图)深度优先生成最小生成树
    客户关系管理系统
    字符串类
    I/O流
  • 原文地址:https://www.cnblogs.com/laiba2004/p/3541631.html
Copyright © 2011-2022 走看看