旅行

本文介绍了一个寻找旅行路径的算法,该算法在一个由多个点和无向边构成的地图中,从起点出发,寻找最短路径并记录经过的点,直至路径闭合。使用邻接表而非邻接矩阵存储大量节点,通过不断查找当前点的最短路径,实现了一次环城市旅行的路径寻找。
摘要由CSDN通过智能技术生成

旅行

A君所在的城市可以抽象成为个有n(1 ≤n ≤ 20000)个点和m(1 ≤ m ≤ 50000)条无向边的地图。

A君住在1号点,他想进行一次环城市旅游。他从1号点出发,每次沿着和1号点相连的边中最短的边到下一个城市(如果有很多个最短的边,选择编号最小的走),到达下一个城市以后,还是沿着和这个城市相连的最短边走到下一个点(如果有很多个最短的边,选择编号最小的走),一直这样走下去,直到要走到一个已经走过的,就结束这次旅行。
 

输入格式:

输入第一行两个整数n, m.
接下来m行,每行输入三个整数u,(1 ≤ u,u≤ n,u≠u),
w(1 ≤ w ≤ 10^5).表示有一条连接u和u长度为w的无向边。

输出格式:

输出一行若干个整数,依次表示蒜头君旅行经过的点,每两个数中间用一个空格隔开。

输入样例:

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

输出样例:

1 4 3

一道简单的图的题目。点的数量很多用邻接矩阵可能是不行的,所以要用邻接表存储图

#include<cstdio>
#include<vector>
using namespace std;

const int maxn=100000000;
struct edge
{
	int v,w;
};
int flag[20000];
vector<edge> G[20000];

void insert1(int u,int v,int w)
{
	edge e;
	e.v=v;
	e.w=w;
	G[u].push_back(e);
}

void insert2(int u,int v,int w)//插入无向边 
{
	insert1(u,v,w);
	insert1(v,u,w);
}
int main()
{
	int n,m,u,v,w;
	scanf("%d%d",&n,&m);
	for(int i=0;i<m;i++)//建立图 
	{
		scanf("%d%d%d",&u,&v,&w);
		insert2(u,v,w);
	}
	
	int now=1;
	while(!flag[now])//当某个地点被标记过后退出循环 
	{
		int minw=maxn,minv=maxn,x;
		for(int i=0;i<G[now].size();i++)//寻找某个顶点出发的最短的一条路径 
		{
			if(G[now][i].w<minw)//找最短的路径 
			{
				minw=G[now][i].w;
				minv=G[now][i].v;
				x=G[now][i].v;
			}
			else if(G[now][i].w==minw&&G[now][i].v<minv)//如果距离一样找编号小的 
			{
				minv=G[now][i].v;
				x=G[now][i].v;
			}
		}
		flag[now]=1;
		printf("%d ",now);
		now=x;
	}
	return 0;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值