#include<iostream>
#include<cstdio>
#include<queue>
#define th(a) this->a=a
using namespace std;
const int maxn=150+10;
const int inf=0x3f3f3f3f;
struct trie_t{
int lnk[64],val;
void init()
{
memset(lnk,0,sizeof(lnk));
val=0;
}
};
const char base='A';
struct Trie{
trie_t buf[maxn*maxn];
int len;
void init()
{
buf[len=0].init();
}
int insert(char *str,int val)
{
int now=0;
for(int i=0;str[i];i++){
int &nxt=buf[now].lnk[str[i]-base];
if(!nxt) buf[nxt=++len].init();
now=nxt;
}
buf[now].val=val;
return now;
}
int search(char *str)
{
int now=0;
for(int i=0;str[i];i++)
{
int &nxt=buf[now].lnk[str[i]-base];
if(!nxt) return 0;
now=nxt;
}
return buf[now].val;
}
}trie;
struct Dijk{
int E[maxn][maxn],n;
int d[maxn],p[maxn];
void init(int n)
{
th(n);
memset(E,63,sizeof(E));
}
void addedge(int a,int b,int val)
{
E[a][b]=E[b][a]=min(E[a][b],val);
}
void solve(int s){
static bool vis[maxn];
memset(vis,0,sizeof(vis));
memset(d,63,sizeof(d));
memset(p,255,sizeof(p));
d[s]=0;
while(1)
{
int u=-1;
for(int i=0;i<n;i++)
{
if(!vis[i]&&(u==-1||d[i]<d[u])){
u=i;
}
}
if(u==-1||d[u]==inf) break;
vis[u]=true;
for(int v=0;v<n;v++)
{
if(d[u]+E[u][v]<d[v]){
d[v]=d[u]+E[u][v];
p[v]=u;
}
}
}
}
}dijk;
char start[40],end[40],s1[40],s2[40];
int a,b,t;
int main()
{
int n,cnt;
while(scanf("%d",&n)!=EOF)
{
if(n==-1)break;
cnt=1;trie.init();dijk.init(maxn);
scanf("%s %s",start,end);
trie.insert(start,cnt++);
trie.insert(end,cnt++);
for(int i=0;i<n;i++)
{
scanf("%s %s %d",s1,s2,&t);
a=trie.search(s1),b=trie.search(s2);
if(a==0)
a=cnt,trie.insert(s1,cnt++);
if(b==0)
b=cnt,trie.insert(s2,cnt++);
dijk.addedge(a, b, t);
dijk.addedge(b, a, t);
}
a=trie.search(start),b=trie.search(end);
dijk.solve(a);
printf("%d\n",dijk.d[b]==0x3f3f3f3f?-1:dijk.d[b]);
}
return 0;
}
hdu 2112 HDU Today 字典树+Dijkstra
最新推荐文章于 2018-07-25 20:41:24 发布
1622

被折叠的 条评论
为什么被折叠?



