hdu 2112 HDU Today( 最短路)

这题我用Dijkstra算法的时间花费为562MS

Floyd算法的时间花费为921MS ,险过

Floyd代码:

 

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<limits.h>
using namespace std;
#define INF 0xffffff
__int64 map[200][200];
char s[200][50];//地名
__int64 d[200][200];//i到j最短路 
void Floyd(int n)
{
	for(int i= 1; i<= n; i++)
		for(int j= 1; j<= n; j++)
			d[i][j]= map[i][j];
	for(int u= 1; u<= n; u++)
		for(int v= 1; v<= n; v++)
			for(int w= 1; w<= n; w++)
			if(d[u][v] + d[u][w] < d[v][w])
				d[v][w]= d[u][v] + d[u][w];			 
}
int Find(int &sum,char *ch)
{
	for(int i= 1; i<= sum; i++)
		if(!strcmp(s[i],ch))
			return i;
	sum++;
	strcpy(s[sum],ch);
	return sum;
}
int main()
{
	int n;
	while(scanf("%d",&n)!=EOF&&n!=-1)
	{
		for(int i= 1; i<= 180; i++)
			for(int j= 1; j<= 180; j++)
			{
				if(i==j)
					map[i][j]= 0;
				else
					map[i][j]= INF;
			}
		int sum= 0;//车站的数目
		char ch1[50],ch2[50];// 起点站,终点站
		int be,end; //起点站,终点站的编号 
		scanf("%s %s",&ch1,&ch2);
		char s1[50],s2[50];
		for(int i= 1; i<= n; i++)
		{
			int a,b,c;
			scanf("%s %s %d",&s1,&s2,&c);
			a= Find(sum,s1);
			b= Find(sum,s2);
			if(c< map[a][b])
				map[a][b]= map[b][a]= c;
		}
		be= Find(sum,ch1);
		end= Find(sum,ch2);
		Floyd(sum);
		if(d[be][end]>= INF)
			printf("-1\n");
		else	
			printf("%I64d\n",d[be][end]); 
	} 
	return 0;
}

 


Dijkstra代码:

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<limits.h>
using namespace std;
#define INF 0xffffff
__int64 map[200][200];
__int64 dis[200];
int vis[200];
char s[200][50];
void Dijkstra(int sum,int be)
{
	for(int i= 1; i<= 150; i++)
		dis[i]= map[be][i];
	memset(vis,0,sizeof(vis));
	vis[be]= 1;
	dis[be]= 0;
	int pre;
	for(int t= 1; t<= sum; t++)
	{
		int min= INF+ 1;
		for(int i= 1; i<= sum; i++)
			if(!vis[i]&&dis[i]< min)
			{
				min= dis[i];
				pre=  i;
			}
		vis[pre]= 1;
		for(int i= 1; i<= sum; i++)
			if(!vis[i]&&dis[i]> dis[pre] + map[pre][i])
				dis[i]= dis[pre] + map[pre][i];
	}
}
int Find(int &sum,char *ch)
{
	for(int i= 1; i<= sum; i++)
		if(!strcmp(s[i],ch))
			return i;
	sum++;
	strcpy(s[sum],ch);
	return sum;
}
int main()
{
	int n;
	while(scanf("%d",&n)!=EOF&&n!=-1)
	{
		for(int i= 1; i<= 180; i++)
			for(int j= 1; j<= 180; j++)
			{
				if(i==j)
					map[i][j]= 0;
				else
					map[i][j]= INF;
			}
		int sum= 0;//车站的数目
		char ch1[50],ch2[50];// 起点站,终点站
		int be,end; //起点站,终点站的编号 
		scanf("%s %s",&ch1,&ch2);
		char s1[50],s2[50];
		for(int i= 1; i<= n; i++)
		{
			int a,b,c;
			scanf("%s %s %d",&s1,&s2,&c);
			a= Find(sum,s1);
			b= Find(sum,s2);
			if(c< map[a][b])
				map[a][b]= map[b][a]= c;
		}
		be= Find(sum,ch1);
		end= Find(sum,ch2);
		Dijkstra(sum,be);
		if(dis[end]>= INF)
			printf("-1\n");
		else
			printf("%I64d\n",dis[end]);
	}
	return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值