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\n");
   else

   {

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

     printf("-1\n");
   }
}
}

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\n");
    else printf("%d\n",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;
}

 

 

 

posted @ 2014-06-28 10:29  人艰不拆_zmc  阅读(319)  评论(0编辑  收藏  举报