【Tsinghua】旅行商(TSP)

2023-11-05 04:48
文章标签 tsinghua tsp 旅行

本文主要是介绍【Tsinghua】旅行商(TSP),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于这道题,我要说两句,这道题我觉得我用拓扑排序的思路肯定是没错的,而且也对了几组数据,但是其他几组却超时,肯定是哪里的代码优化的不够好。。。。。。

最后只得了40分。。。


旅行商(TSP)

描述

Shrek是一个大山里的邮递员,每天负责给所在地区的n个村庄派发信件。但杯具的是,由于道路狭窄,年久失修,村庄间的道路都只能单向通过,甚至有些村庄无法从任意一个村庄到达。这样我们只能希望尽可能多的村庄可以收到投递的信件。

Shrek希望知道如何选定一个村庄A作为起点(我们将他空投到该村庄),依次经过尽可能多的村庄,路途中的每个村庄都经过仅一次,最终到达终点村庄B,完成整个送信过程。这个任务交给你来完成。

输入

第一行包括两个整数n,m,分别表示村庄的个数以及可以通行的道路的数目。

以下共m行,每行用两个整数v1和v2表示一条道路,两个整数分别为道路连接的村庄号,道路的方向为从v1至v2,n个村庄编号为[1, n]。

输出

输出一个数字,表示符合条件的最长道路经过的村庄数。

输入样例

4 3
1 4
2 4
4 3

输出样例

3

限制

1 ≤ n ≤ 1,000,000

0 ≤ m ≤ 1,000,000

输入保证道路之间没有形成环

时间:2 sec

空间:256MB

提示

拓扑排序



最后提交给那个OJ的代码:

#include<iostream>
#include <stdio.h>
#include <malloc.h>#define MAXSIZE 100002
#define TRUE 1
#define FALSE 0using namespace std;typedef int VertexData;
typedef int AdjType;//保存每个节点的最大路数
int Roads[MAXSIZE+1];
int maxRoad=0;typedef struct Stack          //定义栈
{int data[MAXSIZE+1];int top;
}Stack;typedef struct ArcNode		 //定义弧结点
{AdjType adj;ArcNode *nextArc;
}ArcNode;typedef struct VertexNode    //定义顶点
{VertexData vertexData;ArcNode *firstArc;
}VertexNode;typedef struct AdjMatrix     //定义图
{VertexNode vertexNodes[MAXSIZE+1];int verNum,arcNum;
}AdjMatrix;//全局变量
int indegree[MAXSIZE+1]={0};int LocateGraph(AdjMatrix *g, VertexData vertexData)
{int iIndex;for(iIndex=1;iIndex<=g->verNum;iIndex++){if(vertexData==g->vertexNodes[iIndex].vertexData)return iIndex;}return FALSE;
}void  CreateGraph(AdjMatrix *g)
{int iCount,arcStart,arcEnd;int start,end;//输入有向无环图的顶点,及弧数cin>>g->verNum>>g->arcNum;//输入有向无环图的顶点信息ArcNode *q=NULL;for(iCount=1;iCount<=g->verNum;iCount++){    g->vertexNodes[iCount].vertexData=iCount;g->vertexNodes[iCount].firstArc=NULL;}for(iCount=1;iCount<=g->arcNum;iCount++){//输入弧的起始与结束的信息cin>>start>>end;arcStart=LocateGraph(g,start);arcEnd=LocateGraph(g,end);//添加弧结点q=(ArcNode*)malloc(sizeof(ArcNode));q->adj=arcEnd;q->nextArc=g->vertexNodes[arcStart].firstArc;g->vertexNodes[arcStart].firstArc=q;//对于第arcEnd个顶点的入度值加1indegree[arcEnd]++;}
}//判栈空
int IsEmpty(Stack *stack)
{return stack->top==-1?TRUE:FALSE;
}//初始化栈
void InitStack(Stack *stack)
{stack->top=-1;
}//出栈
void Pop(Stack *stack,int *iIndex)
{*iIndex=stack->data[stack->top--];
}//进栈
void Push(Stack *stack,int value)
{stack->data[++stack->top]=value;
}//拓扑排序
void Tuopu(AdjMatrix *g)
{int iCount;Stack *stack=(Stack*)malloc(sizeof(Stack));InitStack(stack);ArcNode *p=NULL;//初始化 路数,都等于1for(iCount=1;iCount<=g->verNum;iCount++)Roads[iCount]=1;//对于入度为0的顶点入栈for(iCount=1;iCount<=g->verNum;iCount++){if(indegree[iCount]==0){Push(stack,iCount);}}//输出拓扑序列//输出顶点后,将与该顶点相连的顶点的边删除,将与相连顶点的入度减1,如减后为0,入栈,栈空结束while(!IsEmpty(stack)){Pop(stack,&iCount);//cout<<g->vertexNodes[iCount].vertexData<<" ";//这里处理路数p=g->vertexNodes[iCount].firstArc;while(p!=NULL){	if(--indegree[p->adj]==0)Push(stack,p->adj);if(Roads[g->vertexNodes[iCount].vertexData]+1>Roads[p->adj])Roads[p->adj]=Roads[g->vertexNodes[iCount].vertexData]+1;if(maxRoad<Roads[p->adj])maxRoad=Roads[p->adj];p=p->nextArc;}}//end while//cout<<endl;
}int main()
{AdjMatrix *g=(AdjMatrix*)malloc(sizeof(AdjMatrix));CreateGraph(g);Tuopu(g);printf("%d\n",maxRoad);return 0;
}


结果:



这篇关于【Tsinghua】旅行商(TSP)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/347508

相关文章

【uva】116-Unidirectional TSP(动态规划,路径问题)

一道很基础的动态规划,不过需要考虑路径(而且是最小字典序)。 转移方程很好写: d[i][j] = min(dp[i + 1][ j] ,dp[i + 1][j - 1] ,dp[i + 1][ j - 1]) + mat[j[i]; dp[i][j]代表走到第i列第行的时候距离最后一行的最短距离; 13991881 116 Unidirectional TSP Accepted C

基于SA模拟退火算法的多车辆TSP问题求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述        基于SA模拟退火算法的多车辆TSP问题求解matlab仿真,三个车辆分别搜索其对应的最短路径,仿真后得到路线规划图和SA收敛曲线。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 (完整程序运行后无水印)

社交平台找旅游搭子一起旅行靠谱吗?答案是不要太爽!

哈喽小伙伴们,今天要跟大家分享一个超级棒的小程序——咕哇找搭子!作为一个热爱自由行的人,最头疼的就是找不到志同道合的小伙伴。但自从用了这个咕哇小程序后,一切都变得简单又充满乐趣啦!🎉 上个月,我计划去云南旅行,就试着在咕哇上发布了我的行程信息。没想到很快就收到了几位朋友的回应,其中一位叫小莲的朋友特别投缘。我们不仅目的地一样,就连兴趣爱好都出奇地相似,于是我们就决定一起出发啦!👭

旅行商问题 | Matlab基于混合粒子群算法GA-PSO的旅行商问题TSP

目录 效果一览基本介绍建模步骤程序设计参考资料 效果一览 基本介绍 混合粒子群算法GA-PSO是一种结合了遗传算法(Genetic Algorithm, GA)和粒子群优化算法(Particle Swarm Optimization, PSO)的优化算法。在解决旅行商问题(Traveling Salesman Problem, TSP)时,这种混合算法可以结合两种算法的优点

P4842 城市旅行(拆贡献 + LCT)

https://www.luogu.com.cn/problem/P4842 发现题目就是要维护一个LCT,然后我们只要把pushup写成功了就行。 那我们现在就不管LCT了,就单纯想用一棵二叉查找树怎么维护。分母是好搞的,分子我们要想点办法。 考虑右子树对左子树的贡献,我们假设处理出一个 L [ k ] L[k] L[k] 表示左子树中每个值乘以左边界的可选数量,我们现在再乘上右子树的大

P3313 [SDOI2014] 旅行(分块做法)

~~~~~      P3313 [SDOI2014] 旅行 ~~~~~      总题单链接 思路 ~~~~~      遇到这种树上路径问题,就考虑用重链剖分转为区间问题。 ~~~~~      问题转换为了:给定一个区间和 k k k,求这个区间内信仰为 k k k 的城市的 权值和 或 最大权值。 ~~~~~      这个问题也可以用动态开点线段树解决(现在不会,以后

旅行追踪和行程规划工具AdventureLog

什么是 AdventureLog ? AdventureLog 是一种记录您的旅行并与世界分享的简单方法。您可以在日志中添加照片、笔记等。跟踪您访问过的国家、探索去过的地区和地方。您还可以查看您的旅行统计数据和里程碑。AdventureLog 旨在成为您终极的旅行伴侣,帮助您记录您的冒险经历并轻松规划新的冒险经历。 主要功能: 使用姓名、日期、地点、描述和评级等字段记录过去的冒险经

模拟退火TSP问题

模拟退火算法在求解最优值问题上有很大的优势,前面一篇博文介绍了用模拟退火算法实现求函数的最大、最小值问题。本文主要介绍如何用python实现模拟退火在TSP(旅行商)问题中的应用,源代码请移步pySA。网络上有不少文章介绍模拟退火TSP应用,可以对比着看。我们对实现的算法进行了测试,动态可视化更加形象。 1. TSP 问题描述 这个问题实际上就是求解最小路劲的问题,不过目前pySA实现还

PHP指尖上的旅行管家手边酒店民宿预订系统小程序源码

指尖上的旅行管家——手边酒店民宿预订系统🌟🛫 🚀 开篇:旅行新伴侣,轻松启程 每次计划旅行,是不是都曾为找酒店、订民宿而头疼不已?🤔 繁琐的搜索、对比、预订流程,让美好的旅程还没开始就有点疲惫了呢。但现在,有了“手边酒店民宿预订系统”,一切都变得不一样了!🎉 它就像是你指尖上的旅行管家,随时待命,为你打造无忧的出行体验。 📱 一键操作,全球住宿尽在掌握 只需轻轻一点,手

1570C 旅行

题目描述 Tom和Alice结婚一段时间了,感情非常好,一天他们相约去旅行,终点在遥远的地方。        地形是非常复杂的,路途是非常曲折的。但我们简化一下是一个矩阵。起点也就是他们家在矩阵的左下角,终点也就是他们要去的遥远的地方在右上角,矩阵行列的交点是他们可以驻足的地方,但是有的却是陷阱,他们是不能从那里通过的。Tom要听Alice的,只会往上或往右走,不往回走,直到终点。