热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HDU6181次短路(K短路)

TwoPathsTimeLimit:40002000MS(JavaOthers)MemoryLimit:153428153428K(JavaOthers)Total

Two Paths

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 153428/153428 K (Java/Others)
Total Submission(s): 613    Accepted Submission(s): 312


Problem Description You are given a undirected graph with n nodes (numbered from 1 to n) and m edges. Alice and Bob are now trying to play a game. 
Both of them will take different route from 1 to n (not necessary simple).
Alice always moves first and she is so clever that take one of the shortest path from 1 to n.
Now is the Bob's turn. Help Bob to take possible shortest route from 1 to n.
There's neither multiple edges nor self-loops.
Two paths S and T are considered different if and only if there is an integer i, so that the i-th edge of S is not the same as the i-th edge of T or one of them doesn't exist.
 

 

Input The first line of input contains an integer T(1 <= T <= 15), the number of test cases.
The first line of each test case contains 2 integers n, m (2 <= n, m <= 100000), number of nodes and number of edges. Each of the next m lines contains 3 integers a, b, w (1 <= a, b <= n, 1 <= w <= 1000000000), this means that there's an edge between node a and node b and its length is w.
It is guaranteed that there is at least one path from 1 to n.
Sum of n over all test cases is less than 250000 and sum of m over all test cases is less than 350000.
 

 

Output For each test case print length of valid shortest path in one line.  

 

Sample Input 23 31 2 12 3 41 3 32 11 2 1  

 

Sample Output 53HintFor testcase 1, Alice take path 1 - 3 and its length is 3, and then Bob will take path 1 - 2 - 3 and its length is 5.For testcase 2, Bob will take route 1 - 2 - 1 - 2 and its length is 3 才讲的K短路,第二天多校就考到这个。=-= 比较裸,直接用A*算法+Dij堆优化,不加堆优化的Dij会超时的,而且这个题数据边的w值会很大,所以所有的边的变量,中间累加的变量,数组存下的长度,最后的A*函数返回结果(一开始WA了很多次,就在这里,返回值也要long long,只顾改了变量了,白白WA了几发)都要设置成long long,第二个就是无向边了,建图和反向建图的两个数组都要push两次。这也是一开始反向建图少一个就WA。 
#include 
#include

#include

#include

#include

#include

#define MAXN 100010
#define INF (1LL<<62)
using namespace std;
typedef
long long ll;
typedef pair
<int, ll> P;
int N, M, S, T, K;
ll dist[MAXN];
ll tdist[MAXN];
int cnt[MAXN];
bool f[MAXN];
vector

Adj[MAXN];
vector

Rev[MAXN];
struct Edge {
int to;
ll len;
Edge(){}
Edge(
int t, ll l):to(t), len(l){}
};
priority_queue
q;

bool operator<(const Edge &a, const Edge &b) {
return (a.len + dist[a.to]) > (b.len + dist[b.to]);
}

void dijkstra() {
memset(dist,
0, sizeof(dist));
fill(tdist, tdist
+MAXN, INF);
tdist[T]
= 0;
while(!q.empty()) q.pop();
q.push(Edge(T,
0));
while (!q.empty()) {
int x = q.top().to;
ll d
= q.top().len;
q.pop();
if (tdist[x] continue;
for (int i = 0; i ) {
int y = Rev[x][i].first;
ll len
= Rev[x][i].second;
if (d+ len < tdist[y]) {
tdist[y]
= d + len;
q.push(Edge(y, tdist[y]));
}
}
}
for (int i = 1; i <= N; i++){
dist[i]
= tdist[i];
}
}

//注意这里是long long的返回结果啊!
ll aStar() {
if (dist[S] == INF) return -1;
while (!q.empty()) q.pop();
q.push(Edge(S,
0));
memset(cnt,
0, sizeof(cnt));
while (!q.empty()) {
int x = q.top().to;
ll d
= q.top().len;
q.pop();
cnt[x]
++;
if (cnt[T] == K) return d;
if (cnt[x] > K) continue;
for (int i = 0; i ) {
int y = Adj[x][i].first;
ll len
= Adj[x][i].second;
q.push(Edge(y, d
+len));
}
}

return -1;
}

int main() {
// freopen("in.txt","r",stdin);
std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int tt;
cin
>>tt;
while(tt--) {
//初始化,忘了就WA
for(int i = 0; i <= N; i++) {
Adj[i].clear();
Rev[i].clear();
}
int a, b;
ll t;
cin
>> N >> M;
for (int i = 0; i ) {
cin >> a >> b >> t;
Adj[a].push_back(make_pair(b, t));
Adj[b].push_back(make_pair(a, t));
Rev[b].push_back(make_pair(a, t));
Rev[a].push_back(make_pair(b, t));
}
S
= 1;
T
= N;
K
= 2;
// cin >> S >> T >> K;

if (S == T) K++;

dijkstra();
cout
< endl;
}
return 0;
}

 

次短路做法,用的别人模版: 原理就是在存dis最短路的时候同时用另外一个数组存次短路,在最短路交换边和dis[]值得时候,次短路存下新交换的没最短边长的值即可。
#include
#include

#include

#include

#include

#include

using namespace std;
typedef
long long int ll;
#define MAXM 350010
#define MAXN 250010
#define INF 1223372036854775807
typedef pair
int> pp;

typedef
struct node
{
int v;
ll w;
node(
int tv=0,ll tw=0):
v(tv),w(tw){};
}node;

int n,m;
vector
edge[MAXM];
ll dis[MAXN],dis2[MAXN];
//dis[i]表示最短路,dis2[i]表示次短路


void solve()
{
fill(dis
+1,dis+n+1,INF);
fill(dis2
+1,dis2+n+1,INF);


priority_queue
, greater > q; //用优先队列加速搜索
dis[1]=0;
q.push(pp(dis[
1],1)); //second是该边指向(虽然是无向的)的顶点,first是这条边的权值
while(q.size())
{
pp p
=q.top(); q.pop();
int v=p.second;
ll d
=p.first;
if(dis2[v]continue; //如果当前取出的值不是到v的最短路或次短路就contniue,因为v->e的最短边和次短边一定是由->v的最短边和次短边+edge(v,e)得到
for(int i=0;i)
{
int e=edge[v][i].v;
ll d2
=d+edge[v][i].w;
if(dis[e]>d2)
{
swap(dis[e],d2);
q.push(pp(dis[e],e));
}
if(dis2[e]>d2&&d2>dis[v]) //d2>dis[v]防止d2小于dis[v],这样v->e就变成负权边了,但可有可无
{
dis2[e]
=d2;
q.push(pp(dis2[e],e));
}
}
}
printf(
"%lld\n",dis2[n]);


}

int main()
{
int t;
scanf(
"%d",&t);
while(t--)
{
scanf(
"%d%d",&n,&m);
for(int i=1;i<=n;i++) edge[i].clear();
for(int i=0;i)
{
int a,b;
ll c;
scanf(
"%d%d%lld",&a,&b,&c);
edge[a].push_back(node(b,c));
edge[b].push_back(node(a,c));
}
solve();
}
}

 

 另个版本,这个版本INF一定要long long 才能过,为什么啊??
#include 
#include

#include

#include

#include

#define INF (1LL<<62)
using namespace std;
typedef
long long ll;
typedef pair
int> P;
struct edge{
int to;
ll v;
edge(
int to,ll v):to(to),v(v){}
edge(){}
};
const int maxn = 100010;
const int maxe = 100010;
int V,E;
vector
g[maxn];
ll d[maxn],d2[maxn];
//最短距离和次短距离
void dijkstra(int s)
{
priority_queue
,greater

> pq;
for(int i=1;i<=V;i++)
{
d[i]
=INF;
d2[i]
=INF;
}
d[s]
=0;
pq.push(P(
0,s));
while(pq.size())
{
P nowe
=pq.top();pq.pop();
if(nowe.first>d2[nowe.second]) continue; //如果这个距离比当前次短路长continue
for(int v=0;v<(int)g[nowe.second].size();v++)
{
edge nexte
=g[nowe.second][v];
ll dis
=nowe.first+nexte.v;
if(d[nexte.to]>dis)
{
swap(dis,d[nexte.to]);
pq.push(P(d[nexte.to],nexte.to));
}
if(d2[nexte.to]>dis&&d[nexte.to]//保证最短路是小于这个次短路的
{
d2[nexte.to]
=dis;
pq.push(P(d2[nexte.to],nexte.to));
//次短路的点进入pq
}
}
}
}
int main()
{
// freopen("in.txt","r",stdin);
int TT;
scanf(
"%d",&TT);
while(TT--) {
int s;//起点
scanf("%d%d",&V,&E);
{
for(int i=1;i<=V;i++)
g[i].clear();
for(int i=1;i<=E;i++)
{
int f,t;
ll v;
scanf(
"%d%d%I64d",&f,&t,&v);
g[f].push_back(edge(t,v));
g[t].push_back(edge(f,v));
}
s
=1;//这题默认起点为1
dijkstra(s);
printf(
"%I64d\n",d2[V]);
}
}
return 0;
}

 


推荐阅读
  • 管理UINavigationController中的手势返回 - Managing Swipe Back Gestures in UINavigationController
    本文介绍了如何在一个简单的闪存卡片应用中实现平滑的手势返回功能,以增强用户体验。 ... [详细]
  • 深入理解Java SE 8新特性:Lambda表达式与函数式编程
    本文作为‘Java SE 8新特性概览’系列的一部分,将详细探讨Lambda表达式。通过多种示例,我们将展示Lambda表达式的不同应用场景,并解释编译器如何处理这些表达式。 ... [详细]
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • 本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ... [详细]
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • spring boot使用jetty无法启动 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 本文详细介绍了如何利用 Bootstrap Table 实现数据展示与操作,包括数据加载、表格配置及前后端交互等关键步骤。 ... [详细]
  • 在Qt框架中,信号与槽机制是一种独特的组件间通信方式。本文探讨了这一机制相较于传统的C风格回调函数所具有的优势,并分析了其潜在的不足之处。 ... [详细]
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • OBS Studio自动化实践:利用脚本批量生成录制场景
    本文探讨了如何利用OBS Studio进行高效录屏,并通过脚本实现场景的自动生成。适合对自动化办公感兴趣的读者。 ... [详细]
author-avatar
小力维2010_622_531
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有