警告:这题卡SPFA,警告:这题卡SPFA 这不是演习

题目大意:给出一个无向图,以及一些点的序列,要找出一条最短的路径使得通过所有点,题目保证存在一条头尾都在点的序列中的最短路满足题意

思路:没有最后那个保证应该就是神题了TUT 有的话显然最后的答案是一条链,而我们要做的便是找出这条链的头尾,随便找个序列中的点跑下最短路,那么头或尾两个点离这个点一定是最远的!找到一个端点后接下来便是DP找下一个端点,记忆化搜索使得路径上包含的序列点数最多,由于题目保证存在方案,最后这条路径一定是答案

最后。。。。这题卡SPFA 这不是演习

 #include <stdio.h>
#include <iostream>
#include<queue>
#include <string.h>
#include <algorithm>
#define maxn 200009
using namespace std;
typedef pair<int,int>pii;
int head[maxn],next[maxn],point[maxn],value[maxn],now=;
int n,m,maxx=-,po,dist[maxn],x,y,z,k,v[maxn],dp[maxn],egz[maxn];
int an=,pp[maxn],final[maxn],oo=;
int num[maxn],route[maxn]; void add(int x,int y,int v,int zz)
{
next[++now]=head[x];
head[x]=now;
point[now]=y;
value[now]=v;
num[now]=zz;
}
struct cmp
{
bool operator()(pii a,pii b)
{
return a.first>b.first;
}
};
void dijkstra(int s)
{
memset(dist,-,sizeof(dist));
dist[s]=;
priority_queue<pii,vector<pii>,cmp>q;
q.push(make_pair(,s));
while(!q.empty())
{
pii u=q.top();
q.pop();
if(u.first>dist[u.second])continue;
for(int i=head[u.second];i!=;i=next[i])
{
int k=point[i];
if(dist[u.second]+value[i]<dist[k] || dist[k]==-)
{
dist[k]=dist[u.second]+value[i];
q.push(make_pair(dist[k],k));
}
}
}
}
/*
void spfa(int s,int o)
{
int visit[maxn]={0};
queue<int>q;
for(int i=1;i<=n;i++)dist[i]=-1;
dist[s]=0;
visit[s]=1;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
visit[u]=0;
for(int i=head[u];i!=0;i=next[i])
{
int k=point[i];
if(dist[u]+value[i]<dist[k]|| dist[k]==-1)
{
dist[k]=dist[u]+value[i];
if(visit[k]==0)
{
visit[k]=1;
q.push(k);
}
}
}
}
}
*/
int dfs(int s,int b)
{
if(dp[s]!=-)return dp[s];
int ans=;
for(int i=head[s];i!=;i=next[i])
{
int u=point[i];
if(dist[u]!=dist[s]+value[i])continue;
int val=dfs(u,(egz[s]?b+:b));
if(val>ans)
{
ans=val;
pp[s]=u;
route[s]=num[i];
if(val==k-)break;
}
}
return dp[s]=ans+(egz[s]==?:);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z,i);
add(y,x,z,i);
}
scanf("%d",&k);
for(int i=;i<=k;i++){scanf("%d",&v[i]);egz[v[i]]=;}
dijkstra(v[]);
for(int i=;i<=k;i++)if(dist[v[i]]>maxx)
{
maxx=dist[v[i]];
po=v[i];
}
dijkstra(po);
memset(dp,-,sizeof(dp));
dfs(po,);
an=po;
while(pp[an]!=)
{
final[++oo]=route[an];
an=pp[an];
}
printf("%d\n",oo);
for(int i=;i<=oo-;i++)printf("%d ",final[i]);
printf("%d",final[oo]);
return ;
}

SGU515:Recover path 【最短路】的更多相关文章

  1. 2018.7中石油个人赛第4场(D-Transit Tree Path)-最短路算法

    6690: Transit Tree Path 时间限制: 1 Sec  内存限制: 128 MB提交: 472  解决: 132[提交] [状态] [讨论版] [命题人:admin] 题目描述 Yo ...

  2. cf 843 D Dynamic Shortest Path [最短路+bfs]

    题面: 传送门 思路: 真·动态最短路 但是因为每次只加1 所以可以每一次修改操作的时候使用距离分层的bfs,在O(n)的时间内解决修改 这里要用到一个小技巧: 把每条边(u,v)的边权表示为dis[ ...

  3. 2019HDU多校Path——最短路最小割

    题目 给出一个 $n$ 个顶点 $m$ 条边的图,要求阻塞一些边,使得从 $1$ 到 $n$ 的最短路变长,求阻塞的边长度和的最小值,不必保证阻塞后可达. 分析 很显然,要阻塞的边肯定在最短路图上,先 ...

  4. HDU - 6582 Path (最短路+最小割)

    题意:给定一个n个点m条边的有向图,每条边有个长度,可以花费等同于其长度的代价将其破坏掉,求最小的花费使得从1到n的最短路变长. 解法:先用dijkstra求出以1为源点的最短路,并建立最短路图(只保 ...

  5. [2019杭电多校第一场][hdu6582]Path(最短路&&最小割)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6582 题意:删掉边使得1到n的最短路改变,删掉边的代价为该边的边权.求最小代价. 比赛时一片浆糊,赛后 ...

  6. 2019CCPC网络预选赛 1004 path 最短路

    题意:给你一张n个点m条边的有向图,问这张有向图的所有路径中第k短的路径长度是多少?n, m, k均为5e4级别. 思路:前些日子有一场div3的F和这个题有点像,但是那个题要求的是最短路,并且k最大 ...

  7. 2019CCPC网络赛 HDU6705 - path K短路

    题意:给出n个点m条边的有向图,问图上第K短路的长度是多少(这里的路可以经过任何重复点重复边). 解法:解法参考https://blog.csdn.net/Ratina/article/details ...

  8. hdu多校第一场1005(hdu6582)Path 最短路/网络流

    题意: 在无向图上删边,让此图上从起点到终点的最短路长度变大,删边的代价是边长,求最小代价. 题解: 先跑一遍迪杰斯特拉,求出所有点的d[]值,然后在原图上保留所有的边(i,j)仅当i,j满足d[j] ...

  9. 2019 Multi-University Training Contest 1 Path(最短路+最小割)

    题意:给你n个点 m条边 现在你能够堵住一些路 问怎样能让花费最少且让1~n走的路比最短路的长度要长 思路:先跑一边最短路 建一个最短路图 然后我们跑一边最大流求一下最小割即可 #include &l ...

随机推荐

  1. js 获取最后一个字符

    方法一: str.charAt(str.length - 1) 方法二: str.subStr(str.length-1,1) 方法三:    var str = "123456" ...

  2. AJPFX总结匿名类及其使用

    匿名类是一种特殊的内部类,它是在一个表达式内部包含一个完整的类定义.内部类是在一个类的内部嵌套定义的类,它可以是其它类的成员也可以在一个语句块的内部定义还可以在表达式内部匿名定义匿名类与其他类的不同就 ...

  3. Android 使用GridView+仿微信图片上传功能(附源代码)

    由于工作要求最近在使用GridView完成图片的批量上传功能,我的例子当中包含仿微信图片上传.拍照.本地选择.相片裁剪等功能,如果有需要的朋友可以看一下,希望我的实际经验能对您有所帮助. 直接上图,下 ...

  4. linux php扩展安装gettext

    php解压后的文件路径为/usr/local/src/php-5.2.6 php 的安装路径为/usr/local/php [root@localhost# cd  /usr/local/src/ph ...

  5. JavaEE-04 数据源配置

    学习要点 JNDI 数据库连接池 完成新闻发布系统数据库连接池 JNDI 说明 JNDI(Java Naming and Directory Interface),中文翻译为Java命名与目录接口,是 ...

  6. Linux下scp报Permission denied错误的解决方法

    sudo vim /etc/ssh/sshd_config 把PermitRootLogin no改成PermitRootLogin yes如果原来没有这行或被注释掉,就直接加上PermitRootL ...

  7. pytorch系列 -- 9 pytorch nn.init 中实现的初始化函数 uniform, normal, const, Xavier, He initialization

    本文内容:1. Xavier 初始化2. nn.init 中各种初始化函数3. He 初始化 torch.init https://pytorch.org/docs/stable/nn.html#to ...

  8. SqlSugar直接执行Sql

    参考:http://www.codeisbug.com/Doc/8/1132 我的思路: 1.数据库中写好sql 2.用SqlSugar直接执行sql,获取DataTable的数据 3.DataTab ...

  9. vue在传值的时候经常遇到的问题

    在我用vue编写程序的时候,在传值的时候,经常会遇到些问题,像今天遇到了两个问题,在用父传子的方法去传值,当父组件中的要传的数据是for循环出来的或者是列表的时候,你想每次运行的事件,都去传某一行,或 ...

  10. 最小生成树 Prim算法 Kruskal算法实现

    最小生成树定义 最小生成树是一副连通加权无向图中一棵权值最小的生成树. 在一给定的无向图 G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即,而 w(u, v) 代表此边的 ...