您的位置:首页 > 编程语言

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

2014-06-28 10:29 471 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐