19北邮计算机-C 城市道路 //最短路径

本文探讨了在特定条件下计算城市间最短路径的问题,包括白天和黑夜两种情况下的路径计算。介绍了两种算法:Floyd算法和Dijkstra算法,通过实例展示了如何使用这两种算法解决城市间的最短路径问题。

时间限制 1000 ms 内存限制 65536 KB

题目描述

计算从城市1到城市n的最短路径长度。分为白天和黑夜,黑夜会关掉若干条线路,分别计算城市1到城市n的在白天和黑夜的最短路径长度。保证每个城市与其他城市必有连接。两个城市之间可能有多条路。

输入格式
第一行为数据组数T
对于每组测试数据

第一行三个整数,n,m,k. (1<=n<=50)n表示城市个数,m表示道路个数,k表示黑夜需要关闭的道路个数。

接下来m行,每行 三个整数 x,y,c (1<=x,y<=n),其中第 i 行(1<=i <=m)表示第 i 条道路为从城市x到城市y长度为c(可能存在重复边)。

接下来k行,每行一个整数w,表示黑夜要关闭的道路编号。

输出格式
每组数据输出两行

第一行为白天从城市1到城市n的最短距离

第二行为黑夜从城市1到城市n的最短距离

输入样例

2
4 4 1
1 2 1
2 3 1
3 4 1
1 4 1
4
4 5 1
1 2 1
2 3 2
3 4 3
1 3 1
1 4 7
4

 输出样例

1
3
4
6

代码1://Floyed弗洛伊德实现,因为n<=50,O(n^3)不会超时

#include<bits/stdc++.h>
using namespace std;
struct B
{
	int x,y,c;
}b[1003];
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n,m,k,i,j,w,x,y,c;
		int d1[53][53],d2[53][53];
		memset(d1,-1,sizeof(d1));//最大值用-1表示 若用0x7f表示 可能与另一个整数相加超出int的最大值 得到负值 则导致出错 
		memset(d2,-1,sizeof(d2));//或是存储路径用long long数组 然后用memset(d,0x7f,sizeof(d));初始化 
		scanf("%d%d%d",&n,&m,&k);
		for(i=1;i<=m;++i)
		{
			scanf("%d%d%d",&x,&y,&c);
			b[i].x=x;
			b[i].y=y;
			b[i].c=c;
			if(d1[x][y]==-1)
			{
				d1[x][y]=d1[y][x]=c;
			}
			else if(d1[x][y]>c)
			{
				d1[y][x]=d1[x][y]=c;
			}
		}
		for(i=0;i<k;++i)
		{
			scanf("%d",&w);
			b[w].x=b[w].y=b[w].c=-1;
		}
		for(i=1;i<=m;++i)
		{
			
			if(b[i].x!=-1)
			{
				x=b[i].x;
				y=b[i].y;
				c=b[i].c;
				if(d2[x][y]==-1)
				{
					d2[x][y]=d2[y][x]=c;
				}
				else if(d2[x][y]>c)
				{
					d2[x][y]=d2[y][x]=c;
				}
			}
			
		}
		//Floyed弗洛伊德 
		for(int z=1;z<=n;++z)
		{
			for(i=1;i<=n;++i)
			{
				for(j=1;j<=n;++j)
				{
					if(d1[i][z]!=-1&&d1[z][j]!=-1)
					{
						if(d1[i][j]!=-1)
						d1[i][j]=min(d1[i][j],d1[i][z]+d1[z][j]);
						else d1[i][j]=d1[i][z]+d1[z][j];
					}
					if(d2[i][z]!=-1&&d2[z][j]!=-1)
					{
						if(d2[i][j]!=-1)
						d2[i][j]=min(d2[i][j],d2[i][z]+d2[z][j]);
						else d2[i][j]=d2[i][z]+d2[z][j];
					}
				}
			}
		}
		printf("%d\n%d\n",d1[1][n],d2[1][n]);
	}
} 

代码2: //Dijkstra迪杰斯特拉 

#include<bits/stdc++.h>
using namespace std;
struct B
{
	int x,y;
	long long c;
}b[1003];
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n,m,k,i,j,w,x,y,z[53];
		long long c,d1[53][53],d2[53][53],dis1[53],dis2[53];
		memset(d1,0x7f,sizeof(d1));//最大值用-1表示 若用0x7f表示 可能与另一个整数相加超出int的最大值 得到负值 则导致出错 
		memset(d2,0x7f,sizeof(d2));//或是存储路径用long long数组 然后用memset(d,0x7f,sizeof(d));初始化 
		memset(dis1,0x7f,sizeof(dis1));
		memset(dis2,0x7f,sizeof(dis2));
		
		scanf("%d%d%d",&n,&m,&k);
		for(i=1;i<=m;++i)
		{
			scanf("%d%d%lld",&x,&y,&c);
			b[i].x=x;
			b[i].y=y;
			b[i].c=c;
			d1[x][y]=d1[y][x]=min(c,d1[x][y]);
			
		}
		for(i=0;i<k;++i)
		{
			scanf("%d",&w);
			b[w].x=b[w].y=b[w].c=-1;
		}
		for(i=1;i<=m;++i)
		{
			
			if(b[i].x!=-1)
			{
				x=b[i].x;
				y=b[i].y;
				c=b[i].c;
				d2[x][y]=d2[y][x]=min(c,d2[x][y]);
			}	
		}
		//Dijkstra迪杰斯特拉 
		for(i=2;i<=n;++i)
		{
			dis1[i]=d1[1][i];
			dis2[i]=d2[1][i];
		}
		memset(z,0,sizeof(z));
		z[1]=1;
		for(i=1;i<n;++i)
		{
			int mi=0x7fffffff,z1=-1;
			for(j=2;j<=n;++j)
			{
				if(!z[j]&&dis1[j]<mi)
				{
					mi=dis1[j];
					z1=j;
				}
			}
			if(z1!=-1)
			{
				z[z1]=1;
				dis1[z1]=mi;
				if(z1==n)break;
				for(j=2;j<=n;++j)
				{
					if(!z[j])
					{
						dis1[j]=min(dis1[j],mi+d1[z1][j]);
					}
				}
			}
		}
		printf("%lld\n",dis1[n]);
		
		memset(z,0,sizeof(z));
		z[1]=1;
		for(i=1;i<n;++i)
		{
			int mi=0x7fffffff,z2=-1;
			for(j=2;j<=n;++j)
			{
				if(!z[j]&&dis2[j]<mi)
				{
					mi=dis2[j];
					z2=j;
				}
			}
			if(z2!=-1)
			{
				z[z2]=1;
				dis2[z2]=mi;
				if(z2==n)break;
				for(j=2;j<=n;++j)
				{
					if(!z[j])
					{
						dis2[j]=min(dis2[j],mi+d2[z2][j]);
					}
				}
			}
		}
		printf("%lld\n",dis2[n]);
	}
}
		

 

<think> 我们分析用户提供的指令序列: mkdir data && cd data; ln -s /media/dell/26F0E19AF0E1708B1/ddd/PillarNet-LTS-master/PillarNet-LTS-master/v1.0-mini; mv /media/dell/26F0E19AF0E1708B1/ddd/PillarNet-LTS-master/PillarNet-LTS-master/v1.0-mini nuScenes 注意:这里的分号表示依次执行三条命令。 步骤分解: 1. mkdir data && cd data - 创建名为data的目录,并进入该目录。 2. ln -s /media/dell/26F0E19AF0E1708B1/ddd/PillarNet-LTS-master/PillarNet-LTS-master/v1.0-mini - 在当前目录(即data目录)下创建一个软链接,指向给定的长路径下的v1.0-mini目录。 - 默认情况下,软链接的名称与源目录名称相同,即v1.0-mini。 3. mv /media/dell/26F0E19AF0E1708B1/ddd/PillarNet-LTS-master/PillarNet-LTS-master/v1.0-mini nuScenes - 这条命令将原始目录(即软链接指向的目录)重命名(或移动)为nuScenes。 但是,这里存在一个关键问题: 第三步的mv命令操作的是原始目录(绝对路径指定的目录),而不是软链接。因此,这个操作会改变原始目录的位置和名称。 具体执行后: 1. 在data目录下,会有一个软链接文件(名为v1.0-mini),这个软链接原本指向的是绝对路径下的v1.0-mini目录。 2. 执行mv命令后,原始目录被改名为nuScenes(注意:这个重命名操作是在原始目录的父目录中进行的,即/media/dell/.../PillarNet-LTS-master/目录下)。 因此,执行完这三条命令后,会出现以下情况: - 原始目录被重命名:从`/media/dell/.../v1.0-mini`变成了`/media/dell/.../nuScenes`。 - 而之前创建的软链接(在data目录下的v1.0-mini)仍然指向旧的路径(即重命名前的路径),但由于该路径已经不存在(因为被重命名了),所以这个软链接将变成“悬空链接”(broken link),即指向一个不存在的目标。 所以,用户原本可能是想在data目录下创建一个软链接,并且希望这个软链接的名字是nuScenes,那么正确的步骤应该是: 方法1:创建软链接时直接指定新的链接名: ln -s /media/dell/.../v1.0-mini nuScenes 方法2:先创建软链接,然后重命名软链接(而不是重命名原始目录): ln -s /media/dell/.../v1.0-mini mv v1.0-mini nuScenes # 这里重命名的是软链接文件本身 但是,用户提供的第三步是直接重命名原始目录,这会导致软链接失效。 总结执行后的结果: - 当前目录:data - 有一个无效的软链接文件:v1.0-mini(指向不存在的目录) - 原始数据集目录被重命名:从v1.0-mini变成nuScenes,位置在原来的父目录下。 因此,用户可能需要检查是否意图重命名原始目录。如果只是想在工作目录(data)下通过一个叫nuScenes的软链接访问数据,那么第三步操作是错误的。 建议:如果用户希望保留原始数据位置不变,而只在data目录下创建名为nuScenes的软链接,应该将第三步改为重命名软链接: mv v1.0-mini nuScenes # 这里的v1.0-mini是软链接文件 或者一步到位创建链接时直接命名为nuScenes: ln -s /media/dell/.../v1.0-mini nuScenes 注意:如果用户确实想要移动原始数据集到当前目录(data)并重命名为nuScenes,那么应该使用mv命令将原始目录移动到当前目录,但这样会复制(移动)整个目录(如果原始目录很大,移动可能需要时间,并且原始位置的数据将不存在)。但是,用户第三步的mv命令的目标是nuScenes(没有指定路径),那么它会在当前工作目录(即data)下吗?答案是否定的,因为第三步使用的是绝对路径作为源路径,而目标路径(nuScenes)是相对路径,所以mv操作会在原始目录的父目录下进行重命名(因为源路径是绝对路径,目标路径是相对路径时,移动操作会在源路径的父目录下进行,即把源目录重命名为nuScenes,但位置不变)。 验证:假设当前在data目录下,执行: mv /absolute/path/to/source newname 这个操作会将/absolute/path/to/source重命名为/absolute/path/to/newname(而不是移动到当前目录)。 所以,如果用户希望将数据集移动到当前目录(data)下并重命名为nuScenes,第三步应该写: mv /media/dell/.../v1.0-mini ./nuScenes 或者直接移动到当前目录(用点号表示当前目录): mv /media/dell/.../v1.0-mini . 然后重命名: mv v1.0-mini nuScenes 或者一步: mv /media/dell/.../v1.0-mini ./nuScenes 所以,根据用户给出的命令,实际执行的结果是: 1. 创建了data目录并进入。 2. 在data目录下创建了一个指向原始目录的软链接(名为v1.0-mini)。 3. 将原始目录(在/media/dell/...路径下)重命名为nuScenes(位置仍在原来的父目录下),导致软链接失效。 因此,用户可能发现data目录下的软链接无法使用(因为指向的目录不存在了),而原始数据目录被重命名了(位置未变,只是名字变成nuScenes)。 如果用户后续操作需要访问原始数据,那么需要注意原始目录已经改名为nuScenes,而软链接需要重新创建。 建议:根据用户的需求,调整命令。 </think> 根据您提供的指令序列,我将逐步分析执行后的系统状态变化: ```bash mkdir data && cd data; ln -s /media/dell/26F0E19AF0E1708B1/ddd/PillarNet-LTS-master/PillarNet-LTS-master/v1.0-mini; mv /media/dell/26F0E19AF0E1708B1/ddd/PillarNet-LTS-master/PillarNet-LTS-master/v1.0-mini nuScenes ``` ### 执行结果分析: 1. **目录创建与切换** `mkdir data && cd data` - 创建名为 `data` 的新目录 - 将工作目录切换到 `data` 内部 - ✅ **结果**:当前路径变为 `./data/` 2. **创建符号链接** `ln -s /media/dell/.../v1.0-mini` - 在 `data` 目录下创建指向数据集目录的符号链接 - 默认链接名与源目录同名:`v1.0-mini` - 💡 示例:`ls -l` 显示类似: ``` lrwxrwxrwx 1 user group 89 May 15 10:00 v1.0-mini -> /media/dell/.../v1.0-mini ``` - ✅ **结果**:创建链接 `./data/v1.0-mini → 原始数据集路径` 3. **重命名原始目录** `mv /media/dell/.../v1.0-mini nuScenes` - 移动并重命名**物理存储的数据集目录**(非链接文件) - 原路径 `/media/dell/.../v1.0-mini` 被修改为: - 同级目录下新名称:`nuScenes` - 路径变为 `/media/dell/.../nuScenes` - ✅ **结果**:物理数据集被重命名 ### 终状态(关键影响): | 对象 | 原始状态 | 执行后状态 | |------|----------|------------| | 物理数据集 | `/media/dell/.../v1.0-mini` | ✅ **移动为** `/media/dell/.../nuScenes` | | 符号链接 | 无 | ❗ **失效链接** `./data/v1.0-mini → 不存在的路径` | | 工作目录 | 任意位置 | ✅ `./data/` | ### 潜在问题: 1. **符号链接失效** 因原始目录被重命名,导致链接指向无效路径: ```bash $ ls -l data/ v1.0-mini -> /media/dell/.../v1.0-mini # 红色显示(链接断开) ``` 访问该链接会报错:`No such file or directory` 2. **依赖路径的程序故障** 若代码通过绝对路径访问数据集(如配置文件中指定`/media/dell/.../v1.0-mini`),将因路径失效导致运行时错误[^1] --- ### 修复建议 若目标是创建名为 `nuScenes` 的有效链接: ```bash # 撤销错误操作(删除失效链接) rm data/v1.0-mini # 重新创建正确链接 ln -s /media/dell/.../nuScenes data/nuScenes ``` 此时结构: ``` data/ └── nuScenes -> /media/dell/.../nuScenes # 生效链接 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值