• 最短路入门HDU2112



    http://acm.hdu.edu.cn/showproblem.php?pid=2112

    中文题。

    map可以水的吧。  字典树+spfa+邻接表。  数组开的有点大 ,复杂度其实可以降不少。

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <map>
    #include <string>
    #include <iostream>
    using namespace std;
    const int INF=0xfffffff;
    struct edge
    {
    	int to;int val;int next;
    }e[1111111];
    
    int l=0;
    int head[22222];
    void add(int from ,int to,int val)
    {
    	e[l].to=to;
    	e[l].val=val;
    	e[l].next=head[from];
    	head[from]=l++;
    }
    int dis[1111111];
    int vis[1111111];
    void spfa(int x)
    {
    	for(int i=0;i<1000000;i++)
    		dis[i]=INF;
    	memset(vis,0,sizeof(vis));
    	dis[x]=0;vis[x]=1;
    	queue<int> q;
    	q.push(x);
    	while(!q.empty()){
    		int cur=q.front();
    		q.pop();
    		vis[cur]=0;
    		for(int i=head[cur];i!=-1;i=e[i].next){
    			int cc=e[i].to;
    			if(dis[cc]>dis[cur]+e[i].val){
    				dis[cc]=dis[cur]+e[i].val;
    				if(!vis[cc]){
    					vis[cc]=1;
    					q.push(cc);
    				}
    			}
    		}
    	}
    }
    
    struct Node
    {
    	int next[59];
    }node[1111111];
    
    int ret=0;
    
    int Insert(char *s)
    {
    	int len=strlen(s);
    	int root=0;
    	for(int i=0;i<len;i++){
    		int cc=s[i]-'a';
    		if(!node[root].next[cc]){
    			node[root].next[cc]=++ret;
    		}
    		root=node[root].next[cc];
    	}
    	return root;
    }
    
    int Find(char *s)
    {
    	int len=strlen(s);
    	int root=0;
    	for(int i=0;i<len;i++){
    		int cc=s[i]-'a';
    		root=node[root].next[cc];
    	}
    	return root;
    }
    
    int main()
    {
    	int n;char str3[2000],str4[2000],str[2000],str1[2000];
    	int a,b,val;
    	while(scanf("%d",&n),n!=-1){
    		memset(head,-1,sizeof(head));
    		scanf("%s%s",str3,str4);
    		for(int i=0;i<n;i++){
    			scanf("%s%s",str,str1);
    			scanf("%d",&val);
    			int a=Insert(str);int b=Insert(str1);
    			add(a,b,val);
    			add(b,a,val);
    		}
    		a=Find(str3);b=Find(str4);
    		spfa(a);
    		if(dis[b]==INF)
    		printf("-1
    ");
    		else
    			printf("%d
    ",dis[b]);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    Appium 服务命令行参数
    DC 输入 输出 时钟 PVT设置
    .synopsys_dc.setup编写
    Excel VBA编程常用语句300句
    C# 泛型单例工厂
    C# Winform与JS交互
    SQL分析“聚集索引、非聚集索引”区别
    C# ClassHelper动态创建程序集和类, 添加/删除类属性
    从30个角度对比 PostgreSQL 和 MySQL
    C# 常用类和命名空间
  • 原文地址:https://www.cnblogs.com/yigexigua/p/3758052.html
Copyright © 2020-2023  润新知