首页 > 代码库 > HDU Today(自己的代码不知道哪里错了一直没A抄袭大神的)

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 1000001int 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;}