hdu2112(Trie树 + Spfa最短路)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_43475173/article/details/100851257

题目

给出几个字符串对之间的距离,求某两个字符串之间的最小距离

题解

几个坑点:

  1. 无向图!无向图!无向图!
  2. 没有路径输出 -1
  3. 既有大写又有小写

主要思想就是用字典树处理字符串成数字节点,然后用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;
}

猜你喜欢

转载自blog.csdn.net/qq_43475173/article/details/100851257
今日推荐