Poj-2249 Remmarguts' Date (K短路)

最大权二分匹配—KM算法入门 && 模板 最大权二分匹配问题就是给二分图的每条边一个权值,选择若干不相交的边,得到的总权值最大。解决这个问题可以用KM算法。理解KM算法需要首先理解“可行顶标”的概念。可行顶标是指关于二分图两边的每个点的一个值lx[i]或ly[j],保证对于每条边w[i][j]都有lx[i]+ly[j]-w[i][j]>=0。如果所有满足lx[i]+ly[j]==w[i][j]的边组成的导出子图中存在一个完美匹配,那么这个 阅读详情
Remmarguts' Date
Time Limit: 4000MS Memory Limit: 65536K
Total Submissions: 19745 Accepted: 5374

Description

"Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, he told them a story. 

"Prince Remmarguts lives in his kingdom UDF – United Delta of Freedom. One day their neighboring country sent them Princess Uyuw on a diplomatic mission." 

"Erenow, the princess sent Remmarguts a letter, informing him that she would come to the hall and hold commercial talks with UDF if and only if the prince go and meet her via the K-th shortest path. (in fact, Uyuw does not want to come at all)" 

Being interested in the trade development and such a lovely girl, Prince Remmarguts really became enamored. He needs you - the prime minister's help! 

DETAILS: UDF's capital consists of N stations. The hall is numbered S, while the station numbered T denotes prince' current place. M muddy directed sideways connect some of the stations. Remmarguts' path to welcome the princess might include the same station twice or more than twice, even it is the station with number S or T. Different paths with same length will be considered disparate. 

Input

The first line contains two integer numbers N and M (1 <= N <= 1000, 0 <= M <= 100000). Stations are numbered from 1 to N. Each of the following M lines contains three integer numbers A, B and T (1 <= A, B <= N, 1 <= T <= 100). It shows that there is a directed sideway from A-th station to B-th station with time T. 

The last line consists of three integer numbers S, T and K (1 <= S, T <= N, 1 <= K <= 1000).

Output

A single line consisting of a single integer number: the length (time required) to welcome Princess Uyuw using the K-th shortest path. If K-th shortest path does not exist, you should output "-1" (without quotes) instead.

Sample Input

2 2
1 2 5
2 1 4
1 2 2

Sample Output

14


思路:

      K短路 A* + SPFA 版(邻接表);

      使用SPFA以终点为起点根据逆向图求最短路,作为A*启发函数中的估价函数;

      A*启发式搜索,其启发函数为 f[p] = g[p] +h[p]; h[p]为搜索至此的代价,g[p]是为估价函数(估计当前点到目标点的最小代价),估价函数要小于是对当前点到目标的代价的实际值,否则会出错!

      需要注意的是,题目要求必须要走,所以当S==T时,K++;这样可以消除最短路为0的情况!

      此处用一个ct[]数组保存每个点出队的次数,当目标节点出队K次时,它的len就是K短路的结果了。


代码:

#include <stdio.h>
#include <string.h>
#include <algorithm> 
#include <queue>
#define N 1010
#define M 100100
#define INF 0x7fffffff
 
using namespace std; 

int dis[N];				// SPFA 
bool visit[N];  

struct Edge{			// 用于构建邻接表
    int to;
	int len;
	int next;			// 类似链表next指针
};  
  
struct Node{  
    int to;  
    int len;  
    bool operator<(const Node &a)const {    // f(i)=d[i]+g[i]  
        return len + dis[to] > a.len + dis[a.to];  
    }  
};  
  

int S, T, K, e_num;
Edge edge[M], reedge[M];
int head[N], rehead[N];  
int ct[N];

void insert(int u, int v, int len)
{  
    edge[e_num].to	= v;				// 建立正向图
    edge[e_num].len = len;  
    edge[e_num].next = head[u];  
    head[u] = e_num;  
	
    reedge[e_num].to = u;				// 建立逆向图
    reedge[e_num].len = len;  
    reedge[e_num].next = rehead[v];  
    rehead[v] = e_num;  
    e_num ++;  
}  
  
void Init()  
{  
    memset(ct, 0, sizeof(ct));  
    memset(head, -1, sizeof(head));  
    memset(rehead, -1, sizeof(rehead));  
    e_num = 0;  
}  
  
void SPFA(int n)		// 以终点为起点根据逆向图求最短路,用作A*的估价函数,结果保存到dis数组  
{  
	int i;
    queue<int>q;    
    for(i = 1; i <= n; i++)
        dis[i] = INF;
      
    q.push(T);
	dis[T] = 0;
    visit[T] = 1;
	
    while(!q.empty()){  
        int cur = q.front();  
        q.pop();
        visit[cur] = 0;  

        for(i = rehead[cur]; i != -1; i = reedge[i].next){		// 遍历以cur为起点的所有边
            int v = reedge[i].to; 
            int len = reedge[i].len;
            if(dis[v] > dis[cur] + len){ 
                dis[v] = dis[cur] + len;  
                if(!visit[v]){
                    q.push(v);
                    visit[v] = 1;  
                }  
            }  
        }  
    }  
}  
  
int A_star()			// A*算法  
{  
    if(S == T)			// 起点终点相等时,题目要求必须要走动,所以K应加1,消除最短路为0的情况
		K ++;  
    if(dis[S] == INF)	// 路径不通的情况
		return -1;

    Node nw;			// 起点
    nw.to = S;
    nw.len = 0;

    priority_queue <Node> q;
    q.push(nw);

    while(!q.empty()){
        Node cur = q.top();
        q.pop();

        ct[cur.to] ++;			// 计数
        if(ct[T] == K)			// 当第K次取到T的时候,输出路程  
            return cur.len;

        for(int i = head[cur.to]; i != -1; i = edge[i].next){
            nw.to = edge[i].to;
            nw.len = edge[i].len + cur.len;
            q.push(nw);
        }  
    }

    return -1;
}  

int main()
{
	int p_e_num, r_e_num, ct;
    int start, to, tm;

	Init();

    scanf("%d%d", &p_e_num, &r_e_num);
    while(r_e_num --){
        scanf("%d%d%d", &start, &to, &tm);
        insert(start, to, tm);
    }
    scanf("%d%d%d", &S, &T, &K);		// 从S出发, 第K次到达T

    SPFA(p_e_num);
	ct = A_star();
	printf("%d\n", ct);

    return 0;
}


【知识点总结】电路原理 第一讲 大家好,从今天起,我将开始更新自上大学以来所学到的各种知识,之所以选择更新它们是因为最近我一直在收拾整理自己自上大学以来所收获到的各种知识,看着那厚厚一沓的书本心里不由得犯愁。如果我想找到特定的知识,那岂不是得翻到猴年马月。俗话说得好,下雨天打鞋子,闲着也是闲着,为此我设置一个专栏,将知识点一一分类总结,目的在于更好的整理所学的知识。本人学艺不精,有一些知识点地方可能存在瑕疵,希望各位大佬可以多多指教。以下是本篇文章正文内容虚断:一般通用性运算放大器的正反向输入端之间的电阻非常非常的大。 阅读详情

相关推荐

别再死记公式了!用HFSS/CST手把手教你仿真一个2.4GHz WiFi的PIFA天线(附参数调试技巧)

本文详细介绍了使用HFSS和CST仿真软件设计2.4GHz WiFi PIFA天线的全流程,包括建模准备、分步操作指南和参数调试技巧。通过可视化结果和实战案例,帮助工程师快速掌握天线设计的关键参数优化方法,提升辐射性能和工作效率。

weixin_31682031的博客 333

Remmarguts' Date(POJ2449+最短路+A*算法)

题目链接:http://poj.org/problem?id=2449 题目: 题意:求有向图两点间的k短路。 思路:最短路+A*算法 代码实现如下: 1 #include <set> 2 #include <map> 3 #include <queue> 4 #include <stack> ...

di6499的博客 132

项目过程记录:ADS-B信号接收并显示(Ubuntu20.04+ANTSDR E310V2)

最近被安排做一个ADS-B信号接收的项目,拿到软件无线电模块(ANTSDR E310V2)后安装环境和软件真的太折磨了。。在此记录以下我走过的弯路,大家可以参考一下。

weixin_43627638的博客 5017

POJ 2449 Remmarguts' Date(第K短路 + A* + 最短路)题解

题意:找出第k短路,输出长度,没有输出-1 思路:这题可以用A*做。A*的原理是这样,我们用一个函数:f = g + h 来表示当前点的预期步数,f代表当前点的预期步数,g代表从起点走到当前的步数,h代表从当前点走到终点的最短路,显然h可以用最短路解出。那么我们从起点开始找,每次找f最小的点,直到找到第k个这样的点。 代码: #include<queue> #include...

weixin_33859665的博客 148

Android13 SurfaceFlinger启动流程分析

在Android13版本中,SurfaceFlinger是由Android.bp去启动init.rc文件,然后再解析文件去加载SurfaceFlinger。上面方法主要处理如下:1、调用surfaceflinger的createSurfaceFlinger方法,实例化surfaceflinger。2、调用flinger(surfaceflinger)的init()方法,在客户端连接之前进行初始化。

liuning1985622的博客 1919

深入解析XTEA加密算法的核心机制与优化策略

本文深入解析XTEA加密算法的核心机制与优化策略,详细介绍了XTEA在嵌入式系统和资源受限环境中的优势,包括其高效的加解密速度和低资源消耗。文章还探讨了XTEA的轮函数设计、关键参数优化策略以及实战应用中的性能对比,为开发者提供了安全增强方案和优化技巧。

k8l9m0n的博客 242

POJ2449:Remmarguts' Date

Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 12450   Accepted: 3422 Description "Good man never makes girls wait or breaks

第七殿堂 702

2026年广东省职业院校技能大赛中职组“大数据应用与服务”样题一完整参考答案

2026年广东省职业院校技能大赛中职组“大数据应用与服务”样题一完整参考答案

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 743

Answer POJ 2449 Remmarguts‘ Date 第K短路_题解

int main() { cin >> n >> m; memset(h, -1, sizeof h); memset(rh, -1, sizeof rh); for (int i = 0; i < m; i++) { int a, b, c; cin >> a >> b >> c; add(h, a, b, c); add(rh, b, a, c); } cin >> S >> T >>

Hw_IT的博客 296

AMDGPU驱动中Doorbell与Event机制简要对比

摘要:AMDGpu驱动中,Doorbell和Event是两种异步通知机制。Doorbell是CPU→GPU的单向硬件通知,通过写MMIO寄存器触发GPU拉取任务,延迟低且无需内核介入,适用于队列任务提交。Event是GPU→CPU的双向同步通知,基于中断和内核事件对象,支持阻塞等待,用于任务完成或异常上报。核心区别在于方向、用途和实现方式:Doorbell侧重任务触发,Event侧重状态反馈。两者配合实现高效的任务下发与完成通知流程。

图形/计算GPU的驱动与虚拟化技术分享园地 1852

DeepFashion 服装识别:基于 YOLOv10 的深度学习实现与 UI 界面开发

随着深度学习的发展,目标检测算法在服装识别任务中表现出色,特别是 YOLO(You Only Look Once)系列模型。服装识别(Fashion Recognition)是计算机视觉领域的重要任务,广泛应用于。已提供,可用于服装分类、款式识别、虚拟试衣等应用。训练服装识别模型,并开发。

YOLO 803

POJ 2249 Remmarguts' Date

求最K短路。 A星+SPFA求解。

Gikieng的奋斗路 644

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

POJ2449 Remmarguts' Date

Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 31080 Accepted: 8486 Description "Good man never makes girls wait or breaks an appointm...

weixin_30666753的博客 68

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

POJ-2249-Remmarguts' Date

这个题要求求出第k短路,开始一直没啥好的思路, 后来才知道这个题要用A*做,虽然看了资料也没太明白,后来参考了别人的博客才做的。 地址:http://blog.sina.com.cn/s/blog_691ce2b701017fe3.html 我用的Spfa做的 代码: #include #include #include #include using namespace std; co

z309241990的专栏 624

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

QDUOJ-16 分糖果(图论, 广搜)

Problem 16: 分糖果 Time Limit:1 Ms| Memory Limit:128 KB Difficulty:1 Description 童年的我们,将和朋友分享美好的事物作为自己的快乐。这天,C小朋友得到了Plenty of candies,将要把这些糖果分给要好的朋友们。已知糖果从一个人传给另一个人需要1 秒的时间,同一个小朋友不会重复接受糖果。由

狂飙的蜗牛 的专栏 3550

hduoj-1874 畅通工程续(Dijistra + Floyd + Bellman_Ford + SPFA)

图论模板题,Dijistra + Floyd + Bellman_Ford + SPFA代码.

狂飙的蜗牛 的专栏 1689

NYOJ-42 一笔画问题(图论,深搜)

一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来。 规定,所有的边都只能画一次,不能重复画。   输入第一行只有一个正整数N(N 每组测试数据的第一行有两个正整数P,Q(P 随后的Q行,每行有

狂飙的蜗牛 的专栏 1569

nyoj-239 月老的难题 (二分图匹配—匈牙利算法 && 网络流—Dinic算法)

月老的难题 二分图匹配-匈牙利算法,网络流-Dinic算法,模板题 描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘。 现在,由于一些原因,部分男孩与女孩可能结成幸福的一家,部分可能不会结成幸福的家庭。 现在已知哪些男孩与哪些女孩如果结婚的话,可以结成幸福的家庭,月老准备促成尽可能多的幸福家庭,请你帮他找出最多可能促成的幸福

狂飙的蜗牛 的专栏 1545

NYOJ-38 布线问题(图论,最小生成树,Prime)

布线问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件: 1、把所有的楼都供上电。 2、所用电线花费最少 输入第一行是一个整数n表示有n组测试数据。(n 每组测试数据的第一行是两个整数v,e. v表示学校里楼的总个数(v 随后

狂飙的蜗牛 的专栏 1445

POJ-2195 Going Home (最小费用最大流初学 && 最大权二分匹配—KM算法)

Going Home 最小费用最大流 && 最大权二分匹配,两种解法 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16870   Accepted: 8636 Description On a grid map there are n little men and n houses. In each unit

狂飙的蜗牛 的专栏 1435

特殊“邻接表”建图方法

(此文借鉴 dollarzhaole 的 《邻接表建图方法及代码》 ) 说明:         建立无向图;         第一行输入n 表示边数; 输入示例:  5  3 4 6  3 7 8  1 3 6  2 4 7  3 5 1 图示例:                 方法:         利用数组和结构体模拟边与边的关系, 极大的节省空间和时

狂飙的蜗牛 的专栏 1265

hduoj-1233 还是畅通工程(Prim + Kruskal)

最小生成树Prim,Kruskal模版题.

狂飙的蜗牛 的专栏 1064

POJ-1094 Sorting it all out (拓扑排序)

Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 26070   Accepted: 9031 Description An ascending sorted sequence of distinct values is one

狂飙的蜗牛 的专栏 994

NYOJ-510 昂贵的聘礼(图论)

昂贵的聘礼 时间限制:1000 ms  |  内存限制:10000 KB 难度:4 描述      年轻的探险家来到了一个印第安部落里。在那里他和酋长的女儿相爱了,于是便向酋长去求亲。酋长要他用10000个金币作为聘礼才答应把女儿嫁给他。探险家拿不出这么多金币,便请求酋长降低要求。酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币。如果你能够弄来他的水

狂飙的蜗牛 的专栏 972

POJ 1273 Drainage Ditches (网络流 EK && Dinic)

Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 53153   Accepted: 20238 Description Every time it rains on Farmer John's fields, a pond form

狂飙的蜗牛 的专栏 873
上一篇: nyoj-123 士兵杀敌(四) (树状数组插线问点—模板题)
下一篇: 最大权二分匹配—KM算法入门 && 模板
tbl00c
博客等级 码龄13年 21粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值