Project 2

GeekOS project2--自己做project2的流程遇到的问题及解决 把project2的编译错误及bochs配置文件都弄好后,编译运行将会看到下面的结果 看到这个结果很奇怪,因为main.c中的Init_Timer();后面初始化没有运行,然后就有了“Switch to a new user address spac, if necessary”这句话。进入Init_Timer()发现调用Calibrate_Delay(),在Calibrate_De 阅读详情

Public Bike Management

There is a public bike service in Hangzhou City which provides great convenience to the tourists from all over the world. One may rent a bike at any station and return it to any other stations in the city.

The Public Bike Management Center (PBMC) keeps monitoring the real-time capacity of all the stations. A station is said to be inperfect condition if it is exactly half-full. If a station is full or empty, PBMC will collect or send bikes to adjust the condition of that station to perfect. And more, all the stations on the way will be adjusted as well.

When a problem station is reported, PBMC will always choose the shortest path to reach that station. If there are more than one shortest path, the one that requires the least number of bikes sent from PBMC will be chosen.

The above figure illustrates an example. The stations are represented by vertices and the roads correspond to the edges. The number on an edge is the time taken to reach one end station from another. The number written inside a vertexSSS is the current number of bikes stored at SSS. Given that the maximum capacity of each station is 10. To solve the problem at S3S_3S​3​​, we have 2 different shortest paths:

  1. PBMC -> S1S_1S​1​​ -> S3S_3S​3​​. In this case, 4 bikes must be sent from PBMC, because we can collect 1 bike fromS1S_1S​1​​ and then take 5 bikes to S3S_3S​3​​, so that both stations will be in perfect conditions.

  2. PBMC -> S2S_2S​2​​ -> S3S_3S​3​​. This path requires the same time as path 1, but only 3 bikes sent from PBMC and hence is the one that will be chosen.

Input Specification:

Each input file contains one test case. For each case, the first line contains 4 numbers:CmaxC_{max}C​max​​ (≤100\le 100≤100), always an even number, is the maximum capacity of each station; NNN (≤500\le 500≤500), the total number of stations; SpS_pS​p​​, the index of the problem station (the stations are numbered from 1 to NNN, and PBMC is represented by the vertex 0); and MMM, the number of roads. The second line contains NNN non-negative numbers CiC_iC​i​​ (i=1,⋯,Ni=1,\cdots ,Ni=1,⋯,N) where each CiC_iC​i​​ is the current number of bikes at SiS_iS​i​​ respectively. Then MMM lines follow, each contains 3 numbers: SiS_iS​i​​,SjS_jS​j​​, and TijT_{ij}T​ij​​ which describe the time TijT_{ij}T​ij​​ taken to move betwen stations SiS_iS​i​​ and SjS_jS​j​​. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print your results in one line. First output the number of bikes that PBMC must send. Then after one space, output the path in the format:0−>S1−>⋯−>Sp0->S_1->\cdots ->S_p0−>S​1​​−>⋯−>S​p​​. Finally after another space, output the number of bikes that we must take back to PBMC after the condition ofSpS_pS​p​​ is adjusted to perfect.

Note that if such a path is not unique, output the one that requires minimum number of bikes that we must take back to PBMC. The judge's data guarantee that such a path is unique.

Sample Input:

10 3 3 5
6 7 0
0 1 1
0 2 1
0 3 3
1 3 1
2 3 1

Sample Output:

3 0->2->3 0

#include<stdio.h>
#include<stdlib.h>

#define MaxVertexNum 505
#define INFINITY 100000

struct GNode{
	int Cmax;
	int N;   /*站点总数*/ 
	int M;   /*边总数*/
	int G[MaxVertexNum][MaxVertexNum];  /*记录每条边的权重*/ 
};

struct Known{
	int top;  /*记录路径时压栈储存*/ 
	int number;  /*记录有几条相同的路径*/ 
	int now;   /*记录当前遍历的节点*/ 
};

struct Result{
	int minsend; /*记录最小send*/ 
	int minback; /*记录最小back*/ 
	int minnumber; /*记录满足答案要求的路径*/ 
};

struct Known *DFS(int Sp, struct Known *know, struct GNode *Graph, int path[][MaxVertexNum], int prepath[], int dist[], int visit[]);
void Dijkstra(int start, int end, int dist[], struct GNode *Graph, int visit[]); /*Dijkstra算法求最短路径*/ 
void initial(struct GNode *Graph, int dist[], int visit[]);  /*初始化函数*/ 
struct Result *compare(int path[][MaxVertexNum], int Sp, struct GNode *Graph, struct Known *konw, struct Result *result, int bikes[]);

int main(void)
{
	int Sp, x, y, weight, i;
	struct GNode *Graph;  /*申明图*/ 
	int bikes[MaxVertexNum];  /*记录每个点储存的自行车数量*/ 
	Graph=(struct GNode*)malloc(sizeof(struct GNode)); /*申请内存空间*/ 
	scanf("%d %d %d %d",&Graph->Cmax,&Graph->N,&Sp,&Graph->M);  
	int dist[Graph->N+1];  /*记录各点到源点的最短路径*/ 
	int visit[Graph->N+1];  /*记录各点是否已经遍历*/ 
	initial(Graph, dist, visit); /*初始化*/ 
	for(i=1; i<=Graph->N; i++)  /*输入每个站点自行车数量*/ 
	{
		scanf("%d",&bikes[i]);
	}
	for(i=0; i<Graph->M; i++)
	{
		scanf("%d %d %d",&x,&y,&weight);
		Graph->G[x][y]=weight; /*无权图双向输入*/ 
		Graph->G[y][x]=weight;
	}
	dist[0]=0;
	visit[0]=1;
	Dijkstra(0,Sp,dist,Graph,visit); /*找到各点到源点的最短路径*/ 
	for(i=1; i<=Graph->N; i++)   /*再一次初始化visit*/ 
	{
		visit[i]=0;
	}
	int path[MaxVertexNum][MaxVertexNum]={0};  /*记录最短路径*/ 
	int prepath[MaxVertexNum]={0}; /*记录当前遍历的路径*/ 
	struct Known *know;  /*储存当前top,now,number数据,便于递归传递*/ 
	know=(struct Known*)malloc(sizeof(struct Known)); /*申请内存*/ 
	know->now=know->number=know->top=0;  /*初始化*/ 
	know=DFS(Sp, know, Graph, path, prepath, dist, visit); /*通过深度便利找到最小距离情况下的路径*/ 
	struct Result *result;
	result=(struct Result*)malloc(sizeof(struct Result));
	result=compare(path, Sp, Graph, know, result, bikes); /*比较各条路径找到正确答案*/ 
	printf("%d ",result->minsend); /*输出最小send*/ 
	for(i=0; i<MaxVertexNum; i++) /*输出最短路径*/ 
	{
		if(path[result->minnumber][i]==Sp)
		{
			printf("%d",path[result->minnumber][i]);
			break;
		}
		else
		{
			printf("%d->",path[result->minnumber][i]);
		}
	}
	printf(" %d\n",result->minback); /*输出最小back*/ 
}

void initial(struct GNode *Graph, int dist[], int visit[]) /*初始化*/ 
{
	int i,j;
	for(i=0; i<=Graph->N; i++)
	{
		for(j=0; j<=Graph->N; j++)
		Graph->G[i][j]=INFINITY;
		dist[i]=INFINITY;
		visit[i]=0;
	}
}

void Dijkstra(int start, int end, int dist[], struct GNode *Graph, int visit[]) /*运用Dijkstra算法计算出最短路径*/ 
{
	int min, v, i, j;
	for(i=1; i<=Graph->N; i++)
	{
		dist[i]=Graph->G[start][i];
	}
	for(i=0; i<Graph->N; i++)
	{
		min=INFINITY;
		for(j=1; j<=Graph->N; j++)
		{
			if(visit[j]==0&&dist[j]<min)  /*找到未遍历的各点距离源点的最近距离*/ 
			{
				v=j;
				min=dist[j];
			}
		}
		if(min==INFINITY) /*如果图只有一个节点则退出*/ 
		break;
		visit[v]=1; /*标记为已经遍历*/ 
		for(j=1; j<=Graph->N; j++)
		{
			if(dist[v]+Graph->G[v][j]<dist[j])  /*如果找到更短的一条路径*/ 
			{
				dist[j]=dist[v]+Graph->G[v][j]; /*更新各点到源点的最短距离*/ 
			}
		}
	}
}
/*深度优先算法*/ 
struct Known *DFS(int Sp, struct Known *know, struct GNode *Graph, int path[][MaxVertexNum], int prepath[], int dist[], int visit[])
{
	int temp;
	int i,j;
	prepath[know->top++]=know->now; /*记录当前遍历的路径*/ 
	if(know->now==Sp) /*如果到达最后的一个节点*/ 
	{
		for(i=0; i<know->top; i++)
		{
			path[know->number][i]=prepath[i];  /*记录当前路径*/ 
		}
		know->number++; /*最短路径数+1*/ 
		know->top--;    /*因为pop出栈顶那个点*/ 
		return know; /*返回top, number, now数据*/ 
	}
	else
	{
		for(j=1; j<=Graph->N; j++)
		{
			if(dist[know->now]+Graph->G[know->now][j]==dist[j]) /*如果路径满足最短路径*/ 
			{
				temp=know->now;
				know->now=j; /*更新当前节点*/ 
				visit[j]=1; /*标记为已经遍历*/ 
				know=DFS(Sp, know, Graph, path, prepath, dist, visit); /*递归,进行深度遍历*/ 
				visit[j]=0; /*退回原路*/ 
				know->now=temp; 
			}
		}
		know->top--; /*因为回退pop出栈顶的点*/ 
		return know; /*返回top, number, now数据*/ 
	}
}
/*比较各条最短路径找到正确答案*/ 
struct Result *compare(int path[][MaxVertexNum], int Sp, struct GNode *Graph, struct Known *know, struct Result *result, int bikes[])
{
	int extra, send, back; /*send表示从源点送出去的数据, extra表示经过一个节点后多余的车辆, back表示最后送回原点的车辆*/  
	result->minsend=result->minback=INFINITY;/*初始化*/ 
	int i,j;
	for(i=0; i<know->number; i++)
	{
		extra=send=back=0;/*初始化*/ 
		for(j=1; j<MaxVertexNum; j++)
		{
			if(path[i][j]==Sp) /*如果到最后一点*/ 
			break;
			else
			{
				if(bikes[path[i][j]]<Graph->Cmax/2) /*如果自行车数小于最大容量的一半*/ 
				{
					if(extra>=Graph->Cmax/2-bikes[path[i][j]]) /*如果extra有多就用extra弥补*/ 
					{
						extra=extra-(Graph->Cmax/2-bikes[path[i][j]]);
					}
					else
					{
						send=send+(Graph->Cmax/2-bikes[path[i][j]]-extra); /*如果extra不够弥补,多余的就用send弥补*/ 
						extra=0; /*extra全部弥补完了,所以清零*/ 
					}
				}
				else if(bikes[path[i][j]]>Graph->Cmax/2) /*如果自行车数大于最大容量的一半*/ 
				{
					extra=extra+bikes[path[i][j]]-Graph->Cmax/2; /*把多余的车数量记在extra上*/ 
				}
			}
		}
		if(bikes[Sp]>=Graph->Cmax/2) /*如果最后一个点大于最大值的一半*/ 
		{
			back=extra+bikes[Sp]-Graph->Cmax/2; /*额外值加上最后一点多余的值就是back*/ 
		}
		else if(bikes[Sp]<Graph->Cmax/2)
		{
			if(extra>=Graph->Cmax/2-bikes[Sp]) /*额外值大于最后一点所需值*/ 
			{
				extra=extra-Graph->Cmax/2+bikes[Sp]; /*额外值减去最后一点所需值就是back*/ 
				back=extra;
			}
			else
			{
				send=send+Graph->Cmax/2-bikes[Sp]-extra; /*send值加上最后一点所需值*/ 
			}
		}
		if(result->minsend>send) /*路径相同,比较send值*/ 
		{
			result->minnumber=i;  /*记录第几条路径最小*/ 
			result->minsend=send; /*更新最小send*/ 
			result->minback=back; /*更新最小back*/ 
		}
		else if(result->minsend==send)
		{
			if(result->minback>back) /*send相同,比较back值*/ 
			{
				result->minnumber=i;  /*记录第几条路径最小*/ 
				result->minback=back; /*更新最小back*/ 
			}
		}
	}
	return result; 
} 



贵校刚结束的project2,请自觉绕行。

Stanford Pintos Project2源代码分析&实现思路 阅读详情

相关推荐

Project2

P5.js的空示例 由斯科特·基尔达尔(Scott Kildall) 概述 这是p5.js空示例的修改版本,可简化目录结构 技术细节 修改sketch.js setup()和draw()函数,然后开始添加函数!

Retrofit 2 Project Reactor Adapter 项目推荐

Retrofit 2 Project Reactor Adapter 项目推荐 1. 项目基础介绍和主要编程语言 Retrofit 2 Project Reactor Adapter 是一个为 Retrofit 2 提供的 CallAdapter 工厂实现,专门用于支持 Project Reactor 的响应式编程模型。该项目的主要编程语言是 Java,并且它依赖于 Retrofit 2 和 Pr...

gitblog_00688的博客 746

project2

project2

Symfony2Project 使用教程

Symfony2Project 使用教程 1. 项目介绍 Symfony2Project 是一个用于生成 Symfony 2 项目初始结构的工具。它提供了一系列命令行选项,帮助开发者快速搭建 Symfony 2 项目的初始结构,包括控制器、ORM、模板引擎等组件的配置。该项目旨在简化 Symfony 2 项目的初始化过程,使开发者能够更专注于业务逻辑的开发。 2. 项目快速启动 安装 首先,确保你...

gitblog_00519的博客 762

循环神经网络(RNN)

在之前学习了全连接神经网络(DNN)模型,网络结构都是从输入层到隐含层再到输出层,层与层之间是全连接或部分连接的,但每层之间的节点是无连接的。 一、神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只要训练数据足够,给定特定的x,就能得到希望的y,结构图如下: 将神经网络模型训练好之后,在输入层给定一个x,通过网络之后就能够在输出层得到特定的y,那么既然有了这么强大的模型,为什么还需要RNN(循环神经网络)呢? 二、为什么需要RNN(循环神经网络) 考虑这样一个问题,如果要预测句子的下一个单词是什么

小朱小朱绝不认输的博客 2万+

二、租用AutoDL服务器与连接教程

点击右上角控制台,选择【租用新的实例】;,我这里使用的是xshell和xftp工具(自行下载)。打开本地目录和服务器目录,直接拖动文件。

zzf021122的博客 1328

解决web2Project 中文乱码

web2Project 是从 dotProject 分支出来的专案管理软体,测试过程中发现,安装后前端新增中文资料,并不会有乱码,但是从MySQL就变成乱码,修正方式如下 服务器端(一般的服务器此部分不用修改) 修改 /etc/my.cnf 代码: [mysqld] default-character-set=utf8 [client] default-character-set=u

OpenCartChina的专栏 1455

《算法第四版》学习心得一——怎么学算法

 一、算法的两个核心 算法的核心内容实际上有两个: 算法的概念和思路。 算法的编程实现。 两者相互关联影响,缺一不可。 不理解基本概念和思路,就算把实现代码背下来,也无济于事,因为脑袋里依然是一片模糊。理解了概念和思路,不去用代码实现,脑袋里有的只是概念,无法根据真实需求实现解决方案。 二、学算法需要什么基础 首先,必须要有一定的编程语言基础,要理解语言中最基本的概念:数据类型,类,成...

illikang的博客 3909

Project2DFX 项目推荐

Project2DFX 项目推荐 项目基础介绍和主要编程语言 Project2DFX 是一个专为 GTA III、Vice City、San Andreas、GTA IV: The Complete Edition、GTA Liberty City Stories 和 GTA Vice City Stories 设计的插件集合。该项目的主要编程语言包括 C 和 C++,其中 C 语言占比约为 79...

gitblog_01178的博客 393

Python实现支付宝转账接口

由于工作需要使用python开发一个自动转账接口,记录一下开发过程。 首先需要在蚂蚁金服上申请开通开发者账户,有了开发者账户就可以使用沙箱进行开发了。 在开发之前我们需要在沙箱应用中填写密钥,密钥的获取可以使用阿里提供的工具包自动生成。 前期准备工作完成了,接下来是编写代码部分。主要用到了python-alipay-sdk库,使用pip安装即可,如果安装的过程中遇到问题推荐使用Anaconda...

FanMLei的博客 8516

树莓派4B学习笔记(5)—— 来个GPIO操作吧

一. GPIO库介绍 对于树莓派,现在有wiringPi,BCM2835,python三种库可以使用。 python 开发语言:python 简单介绍:树莓派官方资料中推荐且容易上手,毫无疑问的说python非常适合树莓派,树莓派也非常适合python。 wiring PI 开发语言:C、C++ 简单介绍:功能很强大,适合那些具有C语言基础,在接触树莓派之前已经接触过单片机或者嵌入式开发的人群。wiring Pi的API函数和arduino非常相似,且作者也给出了很多示例代码,这也使得它广受欢迎。

weixin_44415639的博客 8754

一个解决方案的两个工程Project2需要用Project1的东西

一个解决方案的两个工程Project2需要用Project1的东西 怎么一起编译呢? 只需在Project2的引用中添加Project1即可 啊啊哈哈哈哈哈! 如图:

fgh123的博客 335

TSP、MTSP问题遗传算法详细解读及python实现

写在前面 遗传算法是一种求解NPC问题的启发式算法,属于仿生进化算法族的一员。仿生进化算法是受生物行为启发而发明的智能优化算法,往往是人们发现某种生物的个体虽然行为较为简单,但生物集群通过某种原理却能表现出智能行为。于是不同的人研究不同的生物行为原理,受到启发而发明出新的仿生进化算法。比如免疫优化算法,蚁群算法,模拟退火算法等,这些算法以后也会简单介绍。 本文的主题是遗传算法,该算法也是受到生物行为启发。物竞天择,适者生存,优胜劣汰,是该优化算法的核心思想。笔者在业务中需要用到遗传算法求解TSP问题,但是网

weixin_47675950的博客 9306

Web2Project 开源项目教程

Web2Project 开源项目教程 1. 项目介绍 Web2Project 是一个基于 AMP 栈(Apache、MySQL、PHP)的开源项目管理系统。它提供甘特图、时间记录和一个可扩展的模块系统,适用于各种项目和团队管理需求。Web2Project 是免费软件,用户可以自由使用、扩展、定制、修改其功能和外观。 2. 项目快速启动 以下是快速启动 Web2Project 的步骤: 首先,确保您...

gitblog_00030的博客 457

【纯干货分享】常用高速接口眼图模板合集

文章汇集了常见的高速接口的信号眼图测试模板技术要求,比如,LPDDR5/4、PCIe 5.0/4.0、USB、MIPI等等,方便工程师快速进行查询和使用。

一只豌豆象的博客 3116

BW 技术 InfoObject 初始化,一次把 0LANGU、0CURRENCY、0IOBJNM 这些底座对象讲透

摘要:BW/4HANA和S/4HANA嵌入式分析中最容易被忽视的关键技术InfoObject(如0LANGU、0UNIT等)是系统运行的基础骨架。这些对象虽不直接涉及业务,但若未正确激活会导致多维分析、查询运行等核心功能异常。BW/4HANA中应通过任务清单SAP_BW4_SETUP_SIMPLE或SAP_BW4_SET_OPERATION_SCOPE激活,而非旧事务码RSTCO_ADMIN。S/4HANA嵌入式分析仍需依赖这些底层BW组件,配置需参考SAP Note 2636754。项目实践中需特别关注这

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1385

Symfony2Project 项目推荐

Symfony2Project 项目推荐 1. 项目基础介绍和主要编程语言 Symfony2Project 是一个开源项目,旨在帮助开发者快速生成 Symfony2 框架的初始项目结构。Symfony2 是一个基于 PHP 的高性能、可扩展的 Web 应用框架,广泛应用于企业级应用开发。Symfony2Project 项目的主要编程语言是 PHP。 2. 项目的核心功能 Symfony2Proje...

gitblog_00525的博客 454

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

cmu15445 2023fall project2

【代码】cmu15445 2023fall project2。

qq_58887972的博客 1044

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

TinyKv Project2 PartC RaftKV

project2c 在 project2b 的基础上完成集群的快照功能。分为五个部分:快照生成,快照分发,快照接收,快照应用,日志压缩。

清风 2378

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Project 2: CS61BYoG

CS 61b Project 2

Balaam' s blogs 1128

Mara Example Project 2 使用教程

Mara Example Project 2 使用教程 1、项目介绍 Mara Example Project 2 是一个基于 Python 和 PostgreSQL 的电子商务迷你数据仓库项目。该项目结合了 Mara Pipelines 和 Mara Schema 库,以及 Mara App 框架,旨在展示如何构建一个数据仓库。该仓库旨在作为新项目的模板,整合了电子商务和营销数据,以展示 Mar...

gitblog_00508的博客 842
上一篇: 最短路径问题(2)
下一篇: 4-1 Iterative Mergesort (9分)
csucbMIT
博客等级 码龄10年 7粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值