zoukankan      html  css  js  c++  java
  • HDU Today HDU杭电2112【Dijkstra || SPFA】

    Problem Description
    经过锦囊相助,海东集团最终度过了危机,从此。HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强。

    这时候,XHD夫妇也退居了二线。并在风景秀美的诸暨市浬浦镇陶姚村买了个房子,開始安度晚年了。
    这样住了一段时间。徐总对当地的交通还是不太了解。

    有时非常郁闷,想去一个地方又不知道应该乘什么公交车,在什么地方转车,在什么地方下车(事实上徐总自己有车,却一定要与民同乐。这就是徐总的性格)。
    徐总常常会问蹩脚的英文问路:“Can you help me?

    ”。

    看着他那迷茫而又无助的眼神,热心的你能帮帮他吗?
    请帮助他用最短的时间到达目的地(如果每一路公交车都仅仅在起点站和终点站停,并且随时都会开)。


     

    Input
    输入数据有多组,每组的第一行是公交车的总数N(0<=N<=10000);
    第二行有徐总的所在地start。他的目的地end;
    接着有n行。每行有站名s,站名e,以及从s到e的时间整数t(0<t<100)(每一个地名是一个长度不超过30的字符串)。
    note:一组数据中地名数不会超过150个。
    假设N==-1,表示输入结束。
     

    Output
    假设徐总能到达目的地,输出最短的时间;否则,输出“-1”。


     

    Sample Input
    6 xiasha westlake xiasha station 60 xiasha ShoppingCenterofHangZhou 30 station westlake 20 ShoppingCenterofHangZhou supermarket 10 xiasha supermarket 50 supermarket westlake 10 -1
     

    Sample Output
    50 Hint: The best route is: xiasha->ShoppingCenterofHangZhou->supermarket->westlake 尽管偶尔会迷路。可是由于有了你的帮助 **和**从此还是过上了幸福的生活。 ――全剧终――
     



    #include<stdio.h>
    #include<string.h>
    #include<string>
    #include<map>
    #define INF 0x3f3f3f3f
    #define N 110
    using namespace std;
    int Map[N][N];
    int dis[10100];
    bool used[10100];
    int n;
    int i,j;
    void dijkstra(int u)
    {
    	memset(used,0,sizeof(used));
    	memset(dis,INF,sizeof(dis));
    	int pos=u;
    	for(i=1;i<=100;++i)//第一次给dis赋值 
    	{
    		dis[i]=Map[u][i];
    	}
    	dis[u]=0;
    	used[u]=1;
    	for(i=1;i<100;++i)//最多执行一百次,由于最多有一百个公交车站
    	{
    		int min=INF;
    		for(j=1;j<=100;++j)
    		{
    			if(!used[j]&&dis[j]<min)
    			{
    				min=dis[j];
    				pos=j;
    			}
    		} 
    		used[pos]=1;
    		dis[pos]=min;
    		for(j=1;j<=100;++j)//把dis数组更新,也叫松弛
    		{
    			if(!used[j]&&dis[j]>Map[pos][j]+dis[pos])
    			{
    				dis[j]=Map[pos][j]+dis[pos];
    			}
    		}
    	}
    
    }
    int main()
    {
    	int m;
    	int u,v,w;	
    	char s1[50],s2[50];
    	while(scanf("%d",&n),n!=-1)
    	{		
    		for(i=1;i<=100;++i)
          		for(j=1;j<=i;++j)
            		Map[i][j]=Map[j][i]=INF;
            map<string,int>mp;
            
            scanf("%s%s",s1,s2);
            bool flag=0;
            if(strcmp(s1,s2)==0) flag=1;
            mp[s1]=1;
            mp[s2]=2;
    		int num=3;     
    		while(n--)
    		{
    			scanf("%s%s%d",s1,s2,&w);
    			if(!mp[s1]) mp[s1]=num++;//假设没用过 
    			if(!mp[s2]) mp[s2]=num++;
    			
    			Map[mp[s1]][mp[s2]]=Map[mp[s2]][mp[s1]]=w;
    		}
    		if(flag) printf("0
    ");
    		else
    		{
    			dijkstra(1);
    			if(dis[2]==INF) printf("-1
    ");
    			else 
    				printf("%d
    ",dis[2]);
    		}		
    	}
    	return 0;
    }

    //SPFA

    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <iostream>
    #include <map>
    #include<queue>
    #define M 300
    #define INF 0x3f3f3f3f
    using namespace std;
    int Map[M][M];
    int s=0, e=1;
    int low[10010];
    bool vis[10010];
    void SPFA()
    {
    	int i, j;
    	queue<int> Q;
    	memset(low, INF, sizeof(low)); 
    	memset(vis, 0, sizeof(vis));	
    	vis[1] = 1;
    	low[1] = 0;
    	Q.push(1);
    	while(!Q.empty())
    	{
    		int u = Q.front();
    		Q.pop();
    		vis[u] = 0;//出队列了。不在队列就变成0 
    		for(i = 1; i <= 100; ++i)
    		{
    			
    			if(low[i] > low[u] + Map[u][i])
    			{
    				low[i] = low[u] + Map[u][i];
    				if(!vis[i])				 
    			 	{
    			 		vis[i]=1;
    			 		Q.push(i);
    			 	}
    			}
    		}
    	}
    	if(low[2] == INF) printf("-1
    ");
    	else printf("%d
    ",low[2]);
    }
    int main()
    {
    	int N;
    	char s1[40], s2[40];
    	int u, v, w;
    	while(scanf("%d",&N) && N != -1)
    	{
    		map<string,int>mp;
    		int flag=0;
    		for(int i=1;i<=100;++i)
    			for(int j=1;j<=i;++j)
    				Map[i][j]=Map[j][i]=INF;		
    		scanf("%s%s",s1,s2);
    		if(strcmp(s1,s2)==0) flag=1;
    		mp[s1]=1;
    		mp[s2]=2;
    		int num=3;
    		while(N--)
    		{
    			scanf("%s%s%d",s1,s2,&w);			
    			if(!mp[s1]) mp[s1]=num++;
    			if(!mp[s2]) mp[s2]=num++;
    			Map[mp[s1]][mp[s2]]=Map[mp[s2]][mp[s1]]=w;
    		}		
    		if(flag)
    		{
    			printf("0
    ");
    			continue;
    		}
    		SPFA();
    	}
    	return 0;
    }
    
    /*
    6
    xiasha xiasha
    xiasha station 60
    xiasha ShoppingCenterofHangZhou 30
    station westlake 20
    ShoppingCenterofHangZhou supermarket 10
    xiasha supermarket 50
    supermarket westlake 10
    
    0
    */


  • 相关阅读:
    git的基本使用流程
    进程号和端口的互查
    find: missing argument to `-exec'
    mysql 排除系统库的全部备份
    windows添加“以管理员身份运行”
    sftp服务器的搭建
    ubuntu的sudo免密
    深入理解Java:注解(Annotation)自定义注解入门
    MySQL常见的三种存储引擎
    Intellij Idea 2017 字体模糊解决方案
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/6845335.html
Copyright © 2011-2022 走看看