版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
题目
给出几个字符串对之间的距离,求某两个字符串之间的最小距离
题解
几个坑点:
- 无向图!无向图!无向图!
- 没有路径输出 -1
- 既有大写又有小写
主要思想就是用字典树处理字符串成数字节点,然后用SPFA求最短路,这样就行了
#include<bits/stdc++.h>
using namespace std;
const int maxn =100000;//如果是64MB可以开到2e6+5,尽量开大
int tre[maxn][60];//tree[i][j]表示节点i的第j个儿子的节点编号
char n1[500],n2[500],t1[500],t2[500];
int t,n,m,tot,num;
int d[maxn],vis[maxn];
struct edge
{
int fr,to,ver,nex;
}e[maxn];
int last[maxn];
void add(int x,int y,int z)
{
e[++num].fr=x; e[num].to=y; e[num].ver=z;
e[num].nex=last[x]; last[x]=num;
}
void spfa(int xx)
{
queue<int> q;
memset(d,0x3f3f3f3f,sizeof(d));
memset(vis,0,sizeof(vis));
d[xx]=0,vis[xx]=1;
q.push(xx);
while(q.size())
{
int x=q.front(); q.pop();
vis[x]=0;
for(int i=last[x];i;i=e[i].nex)//遍历
{
int y=e[i].to;
int z=e[i].ver;
if(d[y]>d[x]+z)
{
//cout<<"x:"<<x<<" y:"<<y<<endl;
d[y]=d[x]+z;
if(!vis[y])
vis[y]=1,q.push(y);
}
}
}
}
int insert_(char *str)
{
int len=strlen(str);
int root=0;
int id;
for(int i=0;i<len-1;i++)
{
if(str[i]>='a'&&str[i]<='z')
id=str[i]-'a';
else
id=str[i]-'A'+26;
if(!tre[root][id]) tre[root][id]=++tot;
root=tre[root][id];
}
id=str[len-1]-'a';
if(!tre[root][id]){
tre[root][id]=++tot;
}
return tre[root][id];
}
void init()
{
memset(tre,0,sizeof(tre));
memset(e,0,sizeof(e));
num=0;tot=0;
memset(last,0,sizeof(last));
}
int main()
{
int w,m1,m2,tsd,m3,m4;
while(~scanf("%d",&tsd)){
if(tsd==-1) break;
init();
scanf("%s%s",&n1,&n2);
m1=insert_(n1);m2=insert_(n2);
for(int i=1;i<=tsd;i++){
scanf("%s%s%d",&t1,&t2,&w);
m3=insert_(t1);m4=insert_(t2);
add(m3,m4,w);
add(m4,m3,w);
}
spfa(m1);
if(d[m2]==0x3f3f3f3f)
cout<<"-1"<<endl;
else
cout<<d[m2]<<endl;
}
return 0;
}