【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 0

using 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个顶点的入度值加1
	  indegree[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;

  //初始化 路数,都等于1
  for(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;
}

结果:

时间: 2024-08-03 15:31:14

【Tsinghua】旅行商(TSP)的相关文章

[置顶]群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法【附C#群蚁算法完整项目代码】

若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样的任务,所以就好好把基础研究了一下,驱动式学习,目标明确,所以还是比较快去接受和理解,然后写代码实现就好了.今天就带领大家走近TSP问题以及群蚁算法.  机器学习目录:[目录]数据挖掘与机器学习相关算法文章总目录 本文原文地址:群蚁算法理论与实践全攻略--旅行商等路径优化问题的新方法  1.关于旅行

去哪儿网与多家在线旅行商恢复合作

本报讯(记者索冬冬)近日,有媒体报道称去哪儿网获百度等三大投资方3.5亿元投资,去哪儿网方面则回应称,报道内容与事实非常不符,公司的各种计划按部就班进行中.外界质疑公司近期提价推广酒店在线交易系统(TTS)意在为IPO铺路,去哪儿网则表示,公司整体业务情况良好,不需要通过美化财务数字去上市.百度旗下去哪儿网遭艺龙.同程 等 众多在线旅行商(OTA)抵制事件有了新进展,去哪儿网方面称,同程网.来订吧.腾邦国际已经恢复与去哪儿网的合作,公司会坚持开放平台战略,但绝对不 会转型做OTA.但另一家OTA

微博达人探访江西,日韩等旅行商一并踩线

本报南昌讯 吕宣.记者左阳天报道:19日,由省旅游局主办的""博"动江西·风景独好"大型旅游推广活动在南昌正式启动.120名微博达人组成江西旅游"博"士团,分三批探访赣东北.赣西.赣中南三条精品旅游线路. 微博达人探访江西 记者了解到,省旅游局与腾讯.新浪.搜狐合作,联合邀请海内外120名微博达人组成江西旅游"博"士团,分三批探访赣东北.赣西.赣中南三条精品旅游线路."博"士团将走遍江西11个地市的著名旅游

poj-2677 动态规划、双调欧几里得旅行商

Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2699   Accepted: 1193 Description John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts visiting beautiful places. To save money, John must

群蚁算法理论与实践全攻略

  若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样的任务,所以就好好把基础研究了一下,驱动式学习,目标明确,所以还是比较快去接受和理解,然后写代码实现就好了.今天就带领大家走近TSP问题以及群蚁算法. 1.关于旅行商(TSP)问题及衍化 旅行商问题(Traveling Saleman Problem,TSP)是车辆路径调度问题(VRP)的特例,

python 回溯法 子集树模板 系列 —— 9、旅行商问题(TSP)

问题 旅行商问题(Traveling Salesman Problem,TSP)是旅行商要到若干个城市旅行,各城市之间的费用是已知的,为了节省费用,旅行商决定从所在城市出发,到每个城市旅行一次后返回初始城市,问他应选择什么样的路线才能使所走的总费用最短? 分析 此问题可描述如下:G=(V,E)是带权的有向图,找到包含V中每个结点一个有向环,亦即一条周游路线,使得这个有向环上所有边成本之和最小. 这个问题与前一篇文章的区别就是,本题是带权的图.只要一点小小的修改即可. 解的长度是固定的n+1. 对

有关一道遍历算法的题目

问题描述 有关一道遍历算法的题目 有道题目,有一个点A和若干点,所有的点之间都互相可以连通,并且该连线上都有一个对应的权值,如何设计算法从A点出发遍历所有的点然后回到A点,所得到的权值和最小,并且每个点都可以经过不止一次(没C币了抱歉啊) 解决方案 这个就是迪杰斯特拉算法么,你百度一下实现方法. 解决方案二: 听来的一道算法题目一道算法题目的解法分享一道很有意思的算法题目 解决方案三: 如果这个问题每个点都只能经过一次的话就是一个标准的旅行商(TSP)问题.你可以百度下,解决方法有很多.除了楼上

独家 | 一文读懂优化算法

一.前言 模拟退火.遗传算法.禁忌搜索.神经网络等在解决全局最优解的问题上有着独到的优点,其中共同特点就是模拟了自然过程.模拟退火思路源于物理学中固体物质的退火过程,遗传算法借鉴了自然界优胜劣汰的进化思想,禁忌搜索模拟了人类有记忆过程的智力过程,神经网络更是直接模拟了人脑.它们之间的联系也非常紧密,比如模拟退火和遗传算法为神经网络提供更优良的学习算法提供了思路.把它们有机地综合在一起,取长补短,性能将更加优良. 这几种智能算法有别于一般的按照图灵机进行精确计算的程序,尤其是人工神经网络,是对计算

“高效”,是按时完符合要求的项目的能力

作为软件工程师,你希望从工作中获得的是:稳定的薪水.参与好项目的机会.好工作的跳板或只是和其他程序员成为好基友.这里的"高效",我指的是按时完符合要求的项目的能力.经历过不少软件编写工作后,我相信以下实践会帮助你学会"高效",同时提高专业声望.拉长职业寿命,和获得个人满足 1. 理解你的需求 成为高效程序员的第一步是,保证时间的合理分配.没有什么比将时间花在完全没有前途的工作上更浪费的了. 尽快开工 尽快完成一个直观的系统.这意味着先创建界面,无论是程序界面还是用户