zoukankan      html  css  js  c++  java
  • HDU Today(自己的代码不知道哪里错了一直没A抄袭大神的)

    http://acm.hdu.edu.cn/showproblem.php?pid=2112

    本题题目意思非常简单,麻烦的就是处理一下字符串,这是我能力欠缺的地方

    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #define maxint 200000000
    int map[201][201],visit[201],n,m,s,e;
    int
    dis[202];
    char
    name[201][32];
    int
    find(char str[40])
    {

        int
    i;
        for
    (i=1;i<=m;i++)
        {

          if
    (strcmp(name[i],str)==0)
          return
    i;
        }

       if
    (m==0||i>m)
        m++;
       strcpy(name[m],str);//从一开始进行存储
       return m;
    }

    void
    dijksta(int s,int e)
    {

        int
    i,j,k,min;
        for
    (i=1;i<=m;i++)
       {

         dis[i]=map[s][i];
         visit[i]=i==s?1:0;//如果i==s,visit[i]=1;否则visit[i]=0;
       }
       for
    (i=1;i<=m-1;i++)//m相当于顶点的个数
       {
           min=maxint;
          for
    (j=1;j<=m;j++)
           if
    (visit[j]==0&&dis[j]<min)
           {

                min=dis[j];
                k=j;
           }

          if
    (min==maxint) break;
          visit[k]=1;
        for
    (j=1;j<=m;j++)
          if
    (visit[j]==0&&map[k][j]+dis[k]<dis[j])//相连,没标记过,
         dis[j]=map[k][j]+dis[k];
    }
    }

    void
    init()
    {

    int
    i,j,a,b,c;
    char
    s1[40],s2[40],start[40],end[40];
    while
    (scanf("%d",&n),n!=-1)
    {

      m=0;
      for
    (i=1;i<=140;i++)
       for
    (j=1;j<=140;j++)
        map[i][j]=maxint;//初始化为无穷大
       scanf("%s %s",start,end);//出发地 ,目的地
       for(i=1;i<=n;i++)
       {

        scanf("%s %s %d",s1,s2,&c);//公交的起点,终点及距离
        a=find(s1);
        b=find(s2);
        if
    (map[a][b]>c)
         map[a][b]=map[b][a]=c;
       }

       s=find(start);
       e=find(end);
       if
    (s==e)
        printf("0 ");
       else

       {

        dijksta(s,e);
        if
    (dis[e]!=maxint)//是否为孤立点
         printf("%d ",dis[e]);
        else

         printf("-1 ");
       }
    }
    }

    int
    main()
    {

    init();
    return
    0;
    }

    先把我有乱有麻烦的错误代码贴上,哪天A了

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define N 1000001
    int cmp(const void *a,const void *b)
    {
        return strcmp((char *)a,(char *)b);
    }
    int n;
    char c[202][31],str[31],str2[32];
    char a[20013][31],b[20013][31];
    int bb[10003];
    int map[203][202];
    int v[202],dis[202];
    int Q,E;
    int ttt;
    void D()
    {
        memset(v,0,sizeof(v));
        for(int i=0;i<ttt;i++)
            dis[i]=map[Q][i];
        int i;
        dis[Q]=0;
        v[Q]=1;
        int min;
        int k;
        for(i=1;i<ttt;i++)
        {
            min=N;
            for(int j=0;j<ttt;j++)
            {
                if(v[j]==0&&dis[j]<min)
                {
                    min=dis[j];
                    k=j;
                }
            }
            if(min==N) break;
            v[k]=1;
            for(int j=0;j<ttt;j++)
            {
                if(map[k][j]+dis[k]<dis[j]&&v[j]==0)
                    dis[j]=map[k][j]+dis[k];
            }
    
        }
        if(dis[E]==N)
            printf("-1
    ");
        else printf("%d
    ",dis[E]);
    }
    int main()
    {
        int t;
        int tt;
        while(scanf("%d",&n)!=EOF&&n!=-1)
        {
            for(int i=0;i<=n;i++)
            {
                for(int j=0;j<=n;j++)
                {
                    map[i][j]=N;
                    map[j][i]=N;
                }
                map[i][i]=0;
            }
            tt=0;
            scanf("%s%s",str,str2);
            t=0;
            for(int i=0;i<n;i++)
            {
                scanf("%s %s %d",a[t++],a[t++],&bb[i]);
                strcpy(b[tt++],a[t-2]);
                strcpy(b[tt++],a[t-1]);
            }
            qsort(b,tt,sizeof(b[0]),cmp);
            ttt=0;
            strcpy(c[ttt++],b[0]);
            for(int i=1;i<tt;i++)
            {
                if(strcmp(b[i],b[i-1])!=0)
                {
                   strcpy(c[ttt++],b[i]);
                }
            }
            for(int i=0;i<ttt;i++)
            {
                if(strcmp(str,c[i])==0)
                    Q=i;
                if(strcmp(str2,c[i])==0)
                    E=i;
            }
            int i=0;
            int R,U;
            int ee=0;
            for(i=0;i<n;i++)
            {
                for(int j=0;j<ttt;j++)
                {
                     if(strcmp(c[j],a[ee])==0)
                        R=j;
                      else if(strcmp(c[j],a[ee+1])==0)
                        U=j;
                }
    
                  if(map[R][U]>bb[i])
                  {
                      map[U][R]=bb[i];
                      map[R][U]=bb[i];
                  }
                  ee=ee+2;
    
            }
           D();
        }
        return 0;
    }
  • 相关阅读:
    SQL2008-显示表大小行数
    SQL2008-备份SQL数据库的语句
    SQL2008-截取字段函数
    SQL2008-字符转数字CAST和CONVERT
    SQL2008-查询库中是否存在某表
    SQLServer 2000个人版下载
    SQL2008-不同数据库之间的触发器
    SQL2008--行号的得到
    Microsoft Visual Stduio 2005 Ent安装报错解决方法
    zlib快速编译脚本
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/3813061.html
Copyright © 2011-2022 走看看