zoukankan      html  css  js  c++  java
  • hdoj 2544 最短路【dijkstra or spfa】

    最短路

    Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 38585    Accepted Submission(s): 16862

    Problem Description
    在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
     
    Input
    输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。 输入保证至少存在1条商店到赛场的路线。
     
    Output
    对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
     
    Sample Input
    2 1
    1 2 3
    3 3
    1 2 5
    2 3 5
    3 1 2
    0 0
     
    Sample Output
    3
    2
    dijkstra算法:
    #include<stdio.h>
    #include<string.h>
    #define INF 0x3f3f3f
    int map[110][110]; 
    int visit[110];//记录最短距离节点 
    int lowtime[110];//记录最短 时间 
    int cross;
    int dijkstra()
    {
    	int j,i,mintime,next;
    	memset(visit,0,sizeof(visit));//初始化visit数组为0; 
    	for(i=1;i<=cross;i++)
    	{
    		lowtime[i]=map[1][i];  //初始化lowtime数组为从1到i的时间
    	}
    	visit[1]=1;
    	for(i=1;i<cross;i++)
    	{
    		mintime=INF;
    		for(j=1;j<=cross;j++)
    		{
    			if(!visit[j]&&mintime>lowtime[j])
    			{
    				mintime=lowtime[j];
    				next=j;
    			}
    		}
    		visit[next]=1;
    		for(j=1;j<=cross;j++)
    		{
    			if(!visit[j]&&lowtime[j]>map[next][j]+lowtime[next])
    			lowtime[j]=map[next][j]+lowtime[next];
    		}
    	}
    	printf("%d
    ",lowtime[cross]);
    }
    int main()
    {
    	int road,x,y,c,i,j;
    	while(scanf("%d%d",&cross,&road)&&cross!=0&&road!=0)
    	{
    		for(i=1;i<cross;i++)
    		{
    			for(j=1;j<=cross;j++)
    			{
    				if(i==j)
    				map[i][j]=0;
    				else
    				map[i][j]=map[j][i]=INF;
    			}
    		}
    		while(road--)
    		{
    			scanf("%d%d%d",&x,&y,&c);
    			if(map[x][y]>c)
    			{
    				map[x][y]=map[y][x]=c;
    			}
    		}
    		dijkstra();
    	}
    	return 0;
    }
    

     spfa算法:

    #include<stdio.h>
    #include<string.h>
    #include<queue>
    #define MAX 110
    #define INF 0x3f3f3f
    using namespace std;
    int n,m;
    int map[MAX][MAX],low[MAX];
    bool vis[MAX];
    void init()
    {
    	int i,j;
    	for(i=1;i<=n;i++)
    	    for(j=1;j<=n;j++)
    	        map[i][j]=i==j?0:INF;
    }
    void spfa()
    {
    	int i,j;
    	queue<int>q;
    	while(!q.empty())
    	q.pop();
    	memset(vis,0,sizeof(vis));
    	memset(low,0x3f,sizeof(low));
    	low[1]=0;
    	q.push(1);
    	vis[1]=true;
    	int u;
    	while(!q.empty())
    	{
    		u=q.front();
    		q.pop();
    		vis[u]=false;
    		for(i=1;i<=n;i++)
    		{
    			if(low[i]>low[u]+map[u][i]&&map[u][i]<INF)
    			{
    				low[i]=low[u]+map[u][i];
    				if(!vis[i])
    				{
    					vis[i]=true;
    					q.push(i);
    				}
    			}
    		}
    	}
    	printf("%d
    ",low[n]);
    }
    int main()
    {
    	int i,j;
    	while(scanf("%d%d",&n,&m),n|m)
    	{
    		init();
    		for(i=1;i<=m;i++)
    		{
    			int a,b,c;
    			scanf("%d%d%d",&a,&b,&c);
    			if(map[a][b]>c)
    			map[a][b]=map[b][a]=c;
    		}
    		spfa();
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    【Unity】第10章 Mecanim动画系统
    【Unity】9.3 粒子系统生成器详解
    只用一招,让你Maven依赖下载速度快如闪电
    原来实现项目多环境打包部署是如此的简单
    手写Maven的archetype项目脚手架
    通俗易懂详解Java代理及代码实战
    谈谈分布式版本管理工具Git
    拥抱了IDEA却发现再也回不去Eclipse...
    解决Redisson出现Failed to instantiate [org.redisson.api.RedissonClient]: Factory method 'create' threw exception; nested exception is java.lang.ArrayIndexOutOfBoundsException: 0的问题
    解决org.apache.shiro.session.UnknownSessionException: There is no session with id的问题
  • 原文地址:https://www.cnblogs.com/tonghao/p/4504598.html
Copyright © 2011-2022 走看看