Travelling Fee ZOJ - 2027

Samball is going to travel in the coming vacation. Now it's time to make a plan. After choosing the destination city, the next step is to determine the travel route. As this poor guy has just experienced a tragic lost of money, he really has limited amount of money to spend. He wants to find the most costless route. Samball has just learned that the travel company will carry out a discount strategy during the vacation: the most expensive flight connecting two cities along the route will be free. This is really a big news.

Now given the source and destination cities, and the costs of all the flights, you are to calculate the minimum cost. It is assumed that the flights Samball selects will not have any cycles and the destination is reachable from the source.


Input

The input contains several test cases, each begins with a line containing names of the source city and the destination city. The next line contains an integer m (<=100), the number of flights, and then m lines follow, each contains names of the source city and the destination city of the flight and the corresponding cost. City names are composed of not more than 10 uppercase letters. Costs are integers between 0 to 10000 inclusively.

Process to the end of file.


Output

For each test case, output the minimum cost in a single line.


Sample Input

HANGZHOU BEIJING
2
HANGZHOU SHANGHAI 100
SHANGHAI BEIJING 200


Sample Output

100

题意概括:给出起始城市和终点城市,然后给出n条航班的信息,包括起点、终点和价格,现在让你选择合适的航班从起点到达终点,在你选择的航班里面有一条的花费是可以报销的,具体报销那条航线由你选择。


解题思路:如果不报销花费,那么就是一道最短路径的模板题,但是现在需要报销一条,报销一条也就是说由一条航线的花费是0,如果仍按最短路径算然后减去路径中的最大花费明显是不行的。这道题的数据量比较小,可以先把每条航线的花费依次赋值为0(相当于把每条航线都当成报销的航线依次进行遍历),计算最小花费。最后在这些最小花费中找出真正地最小花费。


代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f
struct city
{
	int s,e;
	int w;
}fl[300];
char start[20],end[20];
int n,a,z,f[600],book[600],d[600];
int map[300][300];
void Dijkstra(int a,int z,int k)
{
	int i,j;
	memset(book,0,sizeof(book));
	memset(d,0,sizeof(d));
//	printf("%d\n",k);
	for(i=1;i<=k;i++)
	{
		d[i]=map[a][i];
	//	printf("%d\n",d[i]);
	}
//	printf("\n");
	d[a]=0;
	for(i=1;i<=k;i++)
	{
		int min_cost=INF;
		int index=-1;
		for(j=1;j<=k;j++)
		{
			if(book[j]==0&&d[j]<min_cost)
			{
				index=j;
				min_cost=d[j];
			}
		}
		if(index==-1)
			break;
		book[index]=1;
	//	printf("%d  ---  %d\n",index,min_cost);
		for(j=1;j<=k;j++)
		{
			if(book[j]==0&&d[j]>min_cost+map[index][j])
			{
				d[j]=min_cost+map[index][j];
			}
		}
	}
}
int main()
{
	int i,j,k;
	char st[300][20],en[300][20];
	while(scanf("%s%s",start,end)!=EOF)
	{
		memset(st,0,sizeof(st));
		memset(en,0,sizeof(en)); 
		scanf("%d",&n);
		for(i=0;i<n;i++)
		{
			scanf("%s%s%d",st[i],en[i],&fl[i].w);
		}
		if(strcmp(start,end)==0)
		{
			printf("0\n");
		}
		else
		{
		
		fl[0].s=1;fl[0].e=2;
		k=3;
		for(i=1;i<n;i++)//给每个城市从1可以往后编号 
		{
			for(j=0;j<i;j++)
			{
				int flag=0;
				if(strcmp(st[i],st[j])==0)
				{
					fl[i].s=fl[j].s;
					flag=1;
					//printf("%s %s\n",st[i],st[j]);
				}	
				if(strcmp(st[i],en[j])==0)
				{
					fl[i].s=fl[j].e;
					flag=1;
					//printf("%s %s\n",st[i],en[j]);
				}
				if(flag==1)
					break;
			}
			if(j==i)
			{
				//printf("k==%d\n",k);
				fl[i].s=k;
				k++;	
			}
			for(j=0;j<i;j++)
			{
				int flag=0;	
				if(strcmp(en[i],en[j])==0)
				{
					//printf("%s %s\n",en[i],en[j]);
					fl[i].e=fl[j].e;
					flag=1;
				}
				if(strcmp(en[i],st[j])==0)
				{
					//printf("%s %s\n",en[i],st[j]);
					fl[i].e=fl[j].s;
					flag=1;
				}
				if(flag==1)
					break;
				
			}
			if(j==i)
			{
				//printf("k==%d\n",k);
				fl[i].e=k;
				k++;
			}
		}
		
		memset(map,INF,sizeof(map));
		for(i=0;i<n;i++)//找到起点城市和终点城市的编号 
		{
			if(strcmp(start,st[i])==0)
			{
				a=fl[i].s;
			}
			if(strcmp(start,en[i])==0)
			{
				a=fl[i].e;
			}
			if(strcmp(end,st[i])==0)
			{
				z=fl[i].s;
			}
			if(strcmp(end,en[i])==0)
			{
				z=fl[i].e;
			}
			if(map[fl[i].s][fl[i].e]>fl[i].w)//把每条路的权值存入map里面 
			{
				map[fl[i].s][fl[i].e]=map[fl[i].e][fl[i].s]=fl[i].w;
			}
			//printf("%d %d %d\n",fl[i].s,fl[i].e,fl[i].w);
		}
			//printf("%d %d\n",a,z);
			int min=99999999;
			for(i=0;i<n;i++) //可以选择一个航线报销,肯定选择最贵的,所以把每个航线 
			{		 //遍历为0(相当于这条线报销的情况下),找出最小的花费 
				int t1=map[fl[i].s][fl[i].e];
				map[fl[i].s][fl[i].e]=map[fl[i].e][fl[i].s]=0;
				Dijkstra(a,z,k-1);
				if(d[z]<min)
					min=d[z];
				map[fl[i].s][fl[i].e]=map[fl[i].e][fl[i].s]=t1;
			}
			printf("%d\n",min);
		}
		memset(start,0,sizeof(start));
		memset(end,0,sizeof(end)); 
	}
	return 0;	
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的医院后台管理系统实现了病房管理、病例管理、处方管理、字典管理、公告信息管理、患者管理、药品管理、医生管理、预约医生管理、住院管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让医院后台管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
BEGIN REGION Servo Power //Servo Power IF "AlwaysTRUE" AND "Control Voltage On" THEN "Robot1 Power for Servo 1-2" := "Robot2 Power for Servo 3-4" := "Robot3 Power for Servo 5-6" := "Robot4 Power for Travelling Servo 7-8" := "Robot5 Power for Travelling Servo 9-10" := true; ELSE "Robot1 Power for Servo 1-2" := "Robot2 Power for Servo 3-4" := "Robot3 Power for Servo 5-6" := "Robot4 Power for Travelling Servo 7-8" := "Robot5 Power for Travelling Servo 9-10" := FALSE; END_IF; //Servo Limit Sensor - 启用硬限位 IF "AlwaysTRUE" AND NOT "Buzzer Stop Button" THEN "DB1002_Control Status Epos".Robot1.X.CamAct := "DB1002_Control Status Epos".Robot1.Z.CamAct := "DB1002_Control Status Epos".Robot2.X.CamAct := "DB1002_Control Status Epos".Robot2.Z.CamAct := "DB1002_Control Status Epos".Robot3.X.CamAct := "DB1002_Control Status Epos".Robot3.Z.CamAct := "DB1002_Control Status Epos".Robot4.X.CamAct := "DB1002_Control Status Epos".Robot4.Z.CamAct := "DB1002_Control Status Epos".Robot5.X.CamAct := "DB1002_Control Status Epos".Robot5.Z.CamAct := "DB1002_Control Status Epos".Load.X.CamAct := "DB1002_Control Status Epos".UnLoad.X.CamAct := TRUE; ELSE "DB1002_Control Status Epos".Robot1.X.CamAct := "DB1002_Control Status Epos".Robot1.Z.CamAct := "DB1002_Control Status Epos".Robot2.X.CamAct := "DB1002_Control Status Epos".Robot2.Z.CamAct := "DB1002_Control Status Epos".Robot3.X.CamAct := "DB1002_Control Status Epos".Robot3.Z.CamAct := "DB1002_Control Status Epos".Robot4.X.CamAct := "DB1002_Control Status Epos".Robot4.Z.CamAct := "DB1002_Control Status Epos".Robot5.X.CamAct := "DB1002_Control Status Epos".Robot5.Z.CamAct := "DB1002_Control Status Epos".Load.X.CamAct := "DB1002_Control Status Epos".UnLoad.X.CamAct := false; END_IF; //Robot1 X Power And Reset "FC192_Robot_Power"("E-Stop" := "DB1002_Control Status Epos".Robot1.X."E-Stop", Fault := "DB1001_Actual Status Epos".Robot1.X.Fault, Ready := "DB1001_Actual Status Epos".Robot1.X.OFF1_Ready, "Alarm Reset" := "Alarm Reset", Off1 => "DB1002_Control Status Epos".Robot1.X.Off1, "Enable Temp" := "DB1003_Servo Button"."Robot1 X"."Servo enabled Temp", "Enable Reset" := "DB1003_Servo Button"."Robot1 X"."Servo enabled Reset", "Time" := "DB3_Time".Robot1.T65);
07-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值