您的位置:首页 > 其它

hdu 2112 HDU Today(最短路+字典树)

2013-12-02 21:32 441 查看
这题有点儿恶趣味了。

1、起点和终点可能是同一点。

2、起点和终点可能根本不会在图里出现。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#define N 155
#define inf 0x3f3f3f3f
int map

,dis
,vis
;
int cnt;
char s1
,s2
;
struct node
{
int flag;
node *next[256];
}*root;
void Init(node *s)
{
s->flag=0;
memset(s->next,0,sizeof(s->next));
return ;
}
int InsertTree(char *s)
{
int ln=strlen(s);
node *ss,*e;
ss=root;
for(int i=0;i<ln;i++)
{
int temp=s[i];
if(ss->next[temp]==NULL)
{
e=(node *)malloc(sizeof(node));
Init(e);
ss->next[temp]=e;
}
ss=ss->next[temp];
if(i==ln-1&&ss->flag==0) ss->flag=cnt++;
if(i==ln-1) return ss->flag;
}
return 0;
}
void Free(node *root)
{
for(int i=0;i<256;i++)
{
if(root->next[i]!=NULL)
Free(root->next[i]);
}
free(root);
return ;
}
int main()
{
int n;
while(scanf("%d",&n),n!=-1)
{
int flag1,flag2,flag3;
flag1=flag2=flag3=0;
root=(node *)malloc(sizeof(node));
Init(root);
cnt=1;
scanf("%s%s",s1,s2);
InsertTree(s1);
InsertTree(s2);
if(cnt==2) flag1=1;
memset(map,0x3f,sizeof(map));
while(n--)
{
int x,y,k;
scanf("%s%s%d",s1,s2,&k);
x=InsertTree(s1);
y=InsertTree(s2);
if(x==1||y==1) flag2=1;
if(x==2||y==2) flag3=1;
if(k<map[x][y]) map[x][y]=map[y][x]=k;
}
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
for(int i=1;i<cnt;i++) dis[i]=map[1][i];
dis[1]=0;vis[1]=1;
for(int i=1;i<cnt;i++)
{
int v=1,temp=inf;
for(int j=1;j<cnt;j++)
{
if(!vis[j]&&dis[j]<temp)
{
v=j;
temp=dis[j];
}
}
vis[v]=1;
for(int j=1;j<cnt;j++)
if(dis[j]>dis[v]+map[v][j]) dis[j]=dis[v]+map[v][j];
}
if(flag2==0) printf("-1\n");
else if(flag1==0&&flag3==0) printf("-1\n");
else if(flag1==1) printf("0\n");
else if(dis[2]<inf) printf("%d\n",dis[2]);
else printf("-1\n");
Free(root);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: