图论&搜索:K短路-启发式搜索
判断第k短路的权值是否小于T
直接把队友的代码拿过来了,一定很经典
- #include <iostream>
- #include <queue>
- #include <cstring>
- #include <vector>
- using namespace std;
- const int maxn = ;
- const int INF = 0x7fffffff;
- int N, M, S, E, K, T;
- int inq[maxn];
- int dis[maxn];
- int cnt[maxn];
- struct Edge
- {
- int u, v, w;
- Edge(int a, int b, int c):u(a), v(b), w(c){}
- };
- struct Node
- {
- int d, v;
- Node(int a, int b):d(a), v(b){}
- bool operator < (const Node &x) const {return d+dis[v]>x.d+dis[x.v];}
- };
- struct Node1
- {
- int d, v;
- Node1(int a, int b):d(a), v(b){}
- bool operator < (const Node1 &x) const {return d>x.d;}
- };
- vector<Edge> edge1;
- vector<Edge> edge2;
- vector<int> G1[maxn];
- vector<int> G2[maxn];
- inline void addedge(int a, int b, int c)
- {
- edge1.push_back(Edge(a,b,c));
- G1[a].push_back(edge1.size()-);
- edge2.push_back(Edge(b,a,c));
- G2[b].push_back(edge2.size()-);
- }
- void dijkstra_init()
- {
- priority_queue<Node1>Q;
- memset(inq, , sizeof(inq));
- std::fill(dis, dis+maxn, INF);
- dis[E] = ;
- Q.push(Node1(, E));
- while(!Q.empty())
- {
- auto x = Q.top(); Q.pop();
- if(inq[x.v]) continue;
- inq[x.v] = true;
- for(int i = ; i < G2[x.v].size(); ++i)
- {
- Edge &m = edge2[G2[x.v][i]];
- if(dis[m.v]>dis[m.u]+m.w)
- {
- dis[m.v] = dis[m.u]+m.w;
- Q.push(Node1(dis[m.v], m.v));
- }
- }
- }
- }
- int k_th()
- {
- memset(cnt, , sizeof(cnt));
- priority_queue<Node>Q;
- if(dis[S]>=INF) return -;
- Node e(, S);
- Q.push(e);
- while(!Q.empty())
- {
- Node x = Q.top();Q.pop();
- cnt[x.v]++;
- if(x.v == E)
- {
- if(x.d>T) return -;
- if(cnt[x.v] == K) return x.d;
- }
- if (cnt[x.v] > K) continue;
- for(unsigned int i = ; i < G1[x.v].size(); i++)
- {
- Node n(x.d+edge1[G1[x.v][i]].w, edge1[G1[x.v][i]].v);
- if(cnt[n.v] != K)
- Q.push(n);
- }
- }
- return -;
- }
- int main()
- {
- while(scanf("%d%d", &N, &M) != EOF)
- {
- edge1.clear();
- edge2.clear();
- for(int i = ; i < maxn; ++i)
- {
- G1[i].clear();
- G2[i].clear();
- }
- scanf("%d%d%d%d", &S, &E, &K, &T);
- for(int i = ; i <= M; ++i)
- {
- int a, b, c;
- scanf("%d%d%d", &a, &b, &c);
- addedge(a, b, c);
- }
- dijkstra_init();
- int ans = k_th();
- if(ans <= T && ans != -) printf("yareyaredawa\n");
- else printf("Whitesnake!\n");
- }
- return ;
- }
图论&搜索:K短路-启发式搜索的更多相关文章
- Remmarguts' Date POJ - 2449 (A*搜索|k短路)
"Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. ...
- 数据结构&图论:K短路-可持久化可并堆
本来A*就可以搞定的题,为了怕以后卡复杂度,找了个这么个方法 现阶段水平不够就不补充算法分析部分了 对于图G,建立一个以终点t为起点的最短路径构成的最短路径树 (就是反着跑一遍最短路,然后对于一个不为 ...
- POJ 2449 Dijstra + A* K短路
这题一开始的思路应该是直接从源点进行BFS搜索K短路. 但这样的复杂度在点数和K的值增大后将会变得很大. 而A*算法则构造一个h(x),在进行BFS时,每次都抛出最小的h(x)从而使汇点的出队速度加快 ...
- 【10.9校内练习赛】【搜索】【2-sat】【树链剖分】【A_star k短路】【差分约束+判负环】
在洛谷上复制的题目! P3154 [CQOI2009]循环赛 题目描述 n队伍比赛,每两支队伍比赛一次,平1胜3负0. 给出队伍的最终得分,求多少种可能的分数表. 输入输出格式 输入格式: 第一行包含 ...
- 多源第k短路 (ford + 重新定义编号) / 出发点、终点确定的第k短路 (Spfa+ 启发搜索)
第k短路 Description 一天,HighLights实在是闲的不行,他选取了n个地点,n各地点之间共有m条路径,他想找到这m条路径组成的第k短路,你能帮助他嘛? Input 第一行三个正整数, ...
- 与图论的邂逅07:K短路
在做最短路的题时我们不免会碰到许多求次短路的题,然而我们也能很快地想到解决的办法: 用dijkstra跑一遍最短路,当终点第二次被取出时就是次短路了.时间复杂度为O((N+M)logN).实际上前面得 ...
- 图论(A*算法,K短路) :POJ 2449 Remmarguts' Date
Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 25216 Accepted: 6882 ...
- WC2015 k小割(k短路+暴力+搜索)
首先这道题不是非同一般的恶心,三个数据层次对应三个程序= = PROBLEM:http://uoj.ac/problems解法: 1~2直接暴力枚举边的选择与否+判断就行了 7~14可以发现是一个平面 ...
- 【模板篇】k短路 SDOI2010 魔法猪学院
题目传送门 吐槽时间 题目分析 代码 题目の传送门 都成了一道模板题了OvO ============================================================= ...
随机推荐
- 遇到Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so问题的解决方法
运行一个基于tensorflow的模型时,遇到Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so问题. 解决方法:打开 ...
- Alpha事后诸葛会议
[设想和目标] Q1:我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? "小葵日记"是为了解决18-30岁年轻用户在记录生活时希望得到一美体验友好 ...
- 博弈---巴什博奕(Bash Game)(博弈入门)
巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规 定每次至少取一个,最多取m个.最后取光者得胜. 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走 ...
- Java clone() 浅拷贝 深拷贝
假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...
- php获取指定div内容
<?php $p="http://127.0.0.1:8080/website/index.html"; $ch = curl_init(); curl_setopt($ch ...
- (十二)Jmeter之Bean Shell的使用(一)
一.什么是Bean Shell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法; BeanShell是一种松散类型的脚本语言(这点和JS类似); BeanS ...
- js获取窗口滚动条高度、窗口可视范围高度、文档实际内容高度、滚动条离浏览器底部的高度
1.获取窗口可视范围的高度 //获取窗口可视范围的高度 function getClientHeight(){ var clientHeight=0; if(document.body.clientH ...
- Hibernate 中 load() 方法导致的 noSession 异常
之所以要写这个,是因为最近碰到了一个延迟加载的 load() 导致出现 noSession 的异常. 下面第三种方式解决这个问题需要用到一个本地线程的对象,也就是 ThreadLocal 类,之前写过 ...
- 平衡树以及AVL树
平衡树是计算机科学中的一类数据结构. 平衡树是计算机科学中的一类改进的二叉查找树.一般的二叉查找树的查询复杂度是跟目标结点到树根的距离(即深度)有关,因此当结点的深度普遍较大时,查询的均摊复杂度会上升 ...
- UVA12585_Poker End Games
题目是这样的,每个人手中有a和b的钱数,c为a和b中间最小的一个. 每个回合,两个人胜利的概率都是0.5,胜利者从失败者手中获得c的钱数. 如果有一个人手中没钱的话,那么他就failer,游戏结束. ...