LS 22 Longest path on DAG(最短路+SPFA)

ls算法 <br /><br />#include<iostream>  //表示你使用的是标注命名空间<br />#include<stdio.h><br />using namespace std; //声明命名空间,避免命名冲突<br />#define NODES 6<br />#define inf 999      //999视为无穷大<br />int  net[105][105];<br />int  d[105],p[105];<br />int  flag[105];    //标志位 ,标志该点 阅读详情

Longest path on DAG

Find the longest path on directed acyclic graph G.

Input

The first line contains two integers n, m, which denote the number of vertices and edges.

The following m lines contains two integer ai, bi, which denote edge ai→bi.

(1≤n≤105,1≤m≤106,1≤ai<bi≤n)

Ouptut

The first line contains an integer l, which denotes the length of longest path.

The second line contains l+1 integers, which denote the longest path with smallest lexicographic order.

Sample input

4 4
1 2
1 3
2 4
3 4

Sample output

2
1 2 4

思路:建边,建个源点0和汇点,然后依次在源点和汇点与中间所有点连边。求源点和汇点的最长路就是答案。

           本题需要从汇点往源点做最短路


#include<iostream>
#include<cstring>
using namespace std;
const int mm=6e6+9;
int ver[mm],next[mm],head[mm],edge,q[mm],dis[mm],fa[mm];
bool vis[mm];
int n,m;
void prepare()
{
  for(int i=0;i<n+2;i++)head[i]=-1,fa[i]=-1;edge=0;
}
void add(int aa,int bb)
{
  ver[edge]=bb;next[edge]=head[aa];head[aa]=edge++;
}
int spfa()
{ memset(dis,-1,sizeof(dis));
  memset(vis,0,sizeof(vis));
  int l=0,r=1,u,v;
  q[l]=0;vis[0]=1;dis[0]=0;
  while(l^r)
  {u=q[l++];l%=mm;vis[u]=0;
    for(int i=head[u];i!=-1;i=next[i])
    { v=ver[i];
      if(dis[v]<dis[u]+1)
      {
        dis[v]=dis[u]+1;fa[v]=u;
        if(!vis[v])
        q[r++]=v,r%=mm,vis[v]=1;
      }
      else if(dis[v]==dis[u]+1&&fa[v]>u)fa[v]=u;
    }
  }
  cout<<dis[n+1]-2<<"\n";
  int pos=0,zz=fa[n+1];
  while(zz!=-1)
  {
    ver[pos++]=zz;
    zz=fa[zz];
  }
  for(int i=0;i<pos-2;i++)
    cout<<ver[i]<<" ";
    cout<<ver[pos-2]<<"\n";
}
int main()
{
  while(cin>>n>>m)
  { int a,b;
    prepare();
    for(int i=0;i<m;i++)
    {
      cin>>a>>b;add(b,a);///建反向边
    }
    for(int i=1;i<=n;i++)
      add(0,i),add(i,n+1);
    spfa();
  }
}





全局最小割 一个无向连通网络,去掉一个边集可以使其变成两个连通分量则这个边集就是割集;最小割集当然就权和最小的割集。 可以用最小切割最大流定理: 1.min=MAXINT,确定一个源点 2.枚举汇点 3.计算最大流,并确定当前源汇的最小割集,若比min小更新min 4.转到2直到枚举完毕 5.min即为所求输出min     不难看出复杂度很高:枚举汇点要O(n),最 阅读详情

相关推荐

Matterport3D数据集介绍与下载(全网最详细)

Matterport3D数据集介绍与下载(全网最详细)

shannanshouyin的博客 2165

Longest Path in DAG 有向无环图中的最长路径问题

第一次看见这个问题是 《算法导论》Chapter 15 动态规划课后思考题15-1的题目。 本文主要参考:http://www.geeksforgeeks.org/find-longest-path-directed-acyclic-graph/问题描述给定一个有向图(Directed Acyclic Graph)以及一个起点s,求该图中s点到其余所有点的最长路径。题解正如算法导论中提到的那样,给

每天完成一个小目标 4800

OpenHarmony-AI调研

基于OpenHarmony-5.0.0版本以及laval社区等网络资料调研当前OH上的AI发展情况。

qqq1112345的博客 1369

算法导论 · 动态规划 · DAG最长路径

算法说明 先对图进行拓扑排序,再从入度的节点开始计算 dilg(v)=max(u,v)∈E{dilg(u)+w(u, v)} 源代码 #include <cstdio> #include <cstring> #include <vector> #include <queue> using namespace std; #define maxn ...

YDDUONG的博客 2521

一文掌握SourceTree使用(超级详细)

SourceTree是一款开源的代码仓库客户端工具,界面美观,操作简单,具有代码克隆、本地创建、提交代码、撤销修改,拉取(pull)代码、上传(push)代码、合并分支等操作。对于软件开发人员是一款必备的应用软件。

GM_115的博客 3万+

SAP成本核算-事中控制(成本对象控制/成本归集与结算)

本文详细介绍了SAP系统中工单成本归集与结算的全流程管理。主要内容包括:1)工单成本三阶段归集(投料、报工、入库)的具体操作与计算方法;2)工单实际成本结算七步骤:从实际费用归集、成本分割、作业价格计算到差异结算的全过程;3)关键注意事项如测试运行验证、价格单位确认、无在制品处理等。通过标准价计算、实际作业重估等机制,系统实现了生产成本从计划到实际的精确核算,最终生成财务所需的差异结算凭证。所有操作均提供单工单和批量处理两种方式,满足不同业务场景需求。

小九啥也不会 1364

动态规划解——有向图中的最长路径

动态规划博大精深,想完全掌握是很难的,不过我们可以从一些简单的例子之中去体会她的奥妙。 不说废话、先来一个简单的例子吧: longest path in DAG Problem: Given a weighted directed acyclic graph G=(V, E), an vertex v, where each edge is assigned an integer we...

weixin_30654419的博客 3117

【数据结构】考点二十八 : 二叉树的概念:二叉树的度、完全二叉树、满二叉数结点数、哈夫曼结点数、完全二叉树的深度

二叉树(Binary Tree)是一种常见的数据结构,它或者为空(null),或者由一个根节点(root node)和两个子树(left subtree 和 right subtree)组成,这两个子树又分别是一棵二叉树。二叉树的每个节点最多有两个子节点,通常称为左子节点(left child)和右子节点(right child)。

超越的博客 1737

ACM_DAG上的动态规划

有向无环图DAG 算法中有时称有向无环图为DAG ( Directed Acyclic Graph)·所谓有向无环图是指:任意一条边有方向,且不存在环路的图。 有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a 这个题目可以抽象为DAG,即X有到Y的边,但是没有到X的边——一个矩形不可能自己包含自己。

svitter的专栏 1833

STM32(HAL库)驱动HC-SR04测距模块

本文介绍通过STM32F103C8T6单片机对HC-SR04测距模块进行驱动,并且通过串口对数据进行打印。

weixin_44597885的博客 2203

基于STM32F1XX 、HAL库的OPT4001-Q1环境光传感器驱动应用C语言程序设计

OPT4001-Q1 的输出是半对数 的,具有 9 个二进制对数满量程照度范围,每个范围内具有高度线性响应,使得 PicoStar™ 型号的测量能力为 312.5μlux 至 84klux,USON 型号的测量能力为 400µlux 至 107klux。// 禁用中断(示例)

PP_Cottage的博客 461

算法导论 思考题 15-1(有向无环图中的最长简单路径)

1

苦海无涯闯进来 3773

【AI】获取各类AI大模型api-key的快速教程(OpenAI、Gemini、Claude、DeepSeek)

【AI】获取各类AI大模型api-key的快速教程(OpenAI、Gemini、Claude、DeepSeek)

funfan的博客 2947

Longest Path(图论)

https://nanti.jisuanke.com/t/43394 题意: 给出一个完全图,任意两个点之间有且只有一条有向边,求一个最长简单路径。 解析: 维护答案路径。对于新的点,如果可以塞在开头则塞在开头(指向原开头)。如果可以塞在最后则塞在最后(原结尾指向该点)。否则考虑拓边(A-B变为A-C-B)。 证明: 代码: /* * Author : Jk_Chen * Date ...

QAQ 1156

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

动态规划——求DAG中最长路径

1.问题描述 给定一个有向无环加权图,求图中的最长路径。 该图中的最长距离为14,即2->4->6->2。 2.问题解决 首先我们要对有向无环加权图进行拓扑排序。拓扑排序的意思简要来说就是将图中顶点和边排成一个线性序列,对于<vi, vj>,经拓扑排序后一定满足vi在vj的前面。 拓扑排序的实现方法: 首先找出图中入度为0的点加入拓扑排序后的序列,例子中为S,接着将...

qq_44502283的博客 4896

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

DAG上的动态规划

嵌套矩形问题 问题描述: 有n个矩形,每个矩形可以用两个整数a,b描述,表示它的长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a&lt;c,b&lt;d,或者b&lt;c,a&lt;d(相当于把矩形X旋转90°)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)内。你的任务是选出尽可能多的矩形排成一行。使得除了最后一个之外,每个矩形都可以嵌套在下一个矩形内。 测试用...

waterboy_cj的博客 287

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

(求DAG图最长路)拓扑排序模板

#include <iostream> #include <string> #include <string.h> #include <algorithm> #include <vector> #include <stack> #define MAXN 10005 #define MAXM 100005 using namespace std;typedef struct Node { in

MM_Silence 1354

hdu4514(求图中最长的路径)

题意:给一个图,如果存在环就输出YES,否则求出图中的最长路径。 解题分析:首先用并查集或dfs判环,然后求图中的最长路径。这里需要知道一个知识点:求一个连通块中的最长路径,首先,从任意从该连通块中任意一个结点 出发,求最长路径,最长路径的端点是S,然后再从S出发求最长路径L,路径L就是所要求的路径,自己画个图想一下就可以理解了。

u013509299的专栏 6485

Tarjan算法缩点+DAG最长路(DP)

第一个问题: Tarjan算法找出一个图里面的全部强连通分量(包括单独的点). 第二个问题: 对每个强连通分量进行缩点, 使得此图变成一张DAG. 第三个问题: 如何快速获得新图各个结点的入度出度. 第四个问题: 缩点之后求解DAG最长路 我们按照复杂程度来讨论不同的Tarjan算法变形的差异. 第一个问题: Tarjan算法找出一个图里面的全部强连通分量(包括单独的点). ...

姬小野的博客 1701

uva 10917 Walk Through the Forest(最短路+DP路径,4级)

Description Problem C: A Walk Through the Forest Jimmy experiences a lot of stress at work these days, especially since his accident made working difficult. To relax after a hard day, he lik

nealgavin的专栏 2130

CF-29C - Mail Stamps(DFS+离散化)

C - Mail Stamps Crawling in process... Crawling failed Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 29C Description

nealgavin的专栏 1707

hdu 4756 Install Air Conditioning(MST+全边次小树,4级)

Install Air Conditioning Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 174    Accepted Submission(s): 23 Problem Description   

nealgavin的专栏 1443

hdu 4650 Minimum Average Weight Path(最短路,5级)

第4场多校联合训练解题报告——详见杭电ACM微博~ Minimum Average Weight Path Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 94    Accepted Submissio

nealgavin的专栏 1389

UVA1416 Warfare And Logistics(LA4080)(最短路,5级)

Description The army of United Nations launched a new wave of air strikes on terrorist forces. The objective of the mission is to reduce enemy's logistical mobility. Each air strike will destro

nealgavin的专栏 1342
上一篇: LS 21 Packing(DP)
下一篇: CF-48E. Ivan the Fool VS Gorynych the Dragon(bfs+dfs+判重回路)
剑不飞
博客等级 码龄15年 86粉丝 505原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值