节点不可重复经过的K短路问题。

思路:二分路径长度,深搜小于等于路径长度的路径数。可以利用可重复点K短路问题中的A*函数进行剪枝。

尝试另一种解法:把可重复点K短路A*直接搬过来,堆中的每个元素额外记录之前走过的所有点。这样就可以据此防止走重复的点。最大100个点,可用两个长整形状态压缩。

一直PE,无法验证效率。

 #include <map>
#include <set>
#include <list>
#include <queue>
#include <stack>
#include <cmath>
#include <vector>
#include <cstdio>
#include <string>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll; #define eps 1e-8
#define inf 0x7f3f3f3f
#define debug puts("BUG")
#define read freopen("in.txt","r",stdin) #define N 111
#define M 11111
struct node
{
int v,w,n;
}ed[M],ed2[M];
int head[N],head2[N],cnt,cnt2;
struct str
{
int v,p;
}st[M*];
struct node2
{
int v,g,f,dx;
ll m1,m2;
void set(int _v,int _g,int _f,int dx,ll m1,ll m2)
{
this->v = _v;
this->g = _g;
this->f = _f;
this->dx = dx;
this->m1 = m1;
this->m2 = m2;
}
bool operator < (const node2 &n) const
{
if (n.f == f) return n.g < g;
return n.f < f;
}
};
void sc(int s,ll &m1,ll &m2)
{
if (s>) m2 |= ((s-)<<);
else m1 |= ((s-)<<);
}
bool ck(int s,ll m1,ll m2)
{
if (s>) return (m2&((s-)<<)) != ;
else return (m1&((s-)<<)) != ;
}
void init()
{
memset(head,-,sizeof(head));
memset(head2,-,sizeof(head2));
cnt = cnt2 = ;
}
void add(int u,int v,int w)
{
ed[cnt].v = v;
ed[cnt].w = w;
ed[cnt].n = head[u];
head[u] = cnt++;
ed2[cnt2].v = u;
ed2[cnt2].w = w;
ed2[cnt2].n = head2[v];
head2[v] = cnt2++;
}
int h[N];
bool vis[N];
void spfa(int s,int n)
{
queue<int>q;
memset(vis,,sizeof(vis));
for (int i = ; i <= n; ++i)
h[i] = inf;
q.push(s);
h[s] = ;
vis[s] = true;
while (!q.empty())
{
int u = q.front();
q.pop();
vis[u] = false;
for (int i=head2[u];~i;i=ed2[i].n)
{
int v = ed2[i].v,w = ed2[i].w;
if (h[v]>h[u]+w)
{
h[v] = h[u] + w;
if (!vis[v])
{
vis[v] = true;
q.push(v);
}
}
}
}
}
int ans[N];
void astar(int s,int t,int k)
{
priority_queue<node2> q;
int cnt = , dx = ;
node2 n,n2;
ll m1=,m2=;
sc(s,m1,m2);
st[dx].p = -,st[dx].v = s;
n.set(s,,h[s],dx++,m1,m2);
q.push(n);
while (!q.empty())
{
n = q.top();
q.pop();
if (n.v == t) cnt++;
if (cnt == k)
{
int a = n.dx, b = ;
while (~a)
{
ans[b++] = st[a].v;
a = st[a].p;
}
printf("%d %d\n",n.g,b);
bool ff = false;
for (int i = b-; i >= ; --i)
{
if (ff) printf(" ");
else ff = true;
printf("%d",ans[i]);
}puts("");
return ;
}
for (int i=head[n.v];~i;i=ed[i].n)
{
int v = ed[i].v, w = ed[i].w;
m1 = n.m1, m2 = n.m2;
if (ck(v,m1,m2)) continue;
sc(v,m1,m2);
st[dx].p = n.dx, st[dx].v = v;
n2.set(v,n.g+w,n.g+w+h[v],dx++,m1,m2);
q.push(n2);
}
}
return ;
}
int main()
{
//read;
int n,m,k;
while (~scanf("%d%d%d",&n,&m,&k))
{
init();
int u,v,w,s,t;
for (int i = ; i < m; ++i)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
scanf("%d%d",&s,&t);
spfa(t,n);
astar(s,t,k);
}
return ;
}

SGU 145的更多相关文章

  1. SGU 145.Strange People(无环K短路)

    时间:0.25s空间:4m 题意: 其实就是求无环第K短路. 输入: 给出n,m,k,分别代表,n个点,m条边,第k长路. 接下来m行,三个整数x,y,z,分别代表x,y之间有条费用为x的双向路.保证 ...

  2. SGU 分类

    http://acm.sgu.ru/problemset.php?contest=0&volume=1 101 Domino 欧拉路 102 Coprime 枚举/数学方法 103 Traff ...

  3. SGU 495. Kids and Prizes

    水概率....SGU里难得的水题.... 495. Kids and Prizes Time limit per test: 0.5 second(s)Memory limit: 262144 kil ...

  4. ACM: SGU 101 Domino- 欧拉回路-并查集

    sgu 101 - Domino Time Limit:250MS     Memory Limit:4096KB     64bit IO Format:%I64d & %I64u Desc ...

  5. 【SGU】495. Kids and Prizes

    http://acm.sgu.ru/problem.php?contest=0&problem=495 题意:N个箱子M个人,初始N个箱子都有一个礼物,M个人依次等概率取一个箱子,如果有礼物则 ...

  6. SGU 455 Sequence analysis(Cycle detection,floyd判圈算法)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=455 Due to the slow 'mod' and 'div' operati ...

  7. SGU 422 Fast Typing(概率DP)

    题目大意 某人在打字机上打一个字符串,给出了他打每个字符出错的概率 q[i]. 打一个字符需要单位1的时间,删除一个字符也需要单位1的时间.在任意时刻,他可以花 t 的时间检查整个打出来的字符串,并且 ...

  8. sgu 104 Little shop of flowers 解题报告及测试数据

    104. Little shop of flowers time limit per test: 0.25 sec. memory limit per test: 4096 KB 问题: 你想要将你的 ...

  9. 树形DP求树的重心 --SGU 134

    令一个点的属性值为:去除这个点以及与这个点相连的所有边后得到的连通分量的节点数的最大值. 则树的重心定义为:一个点,这个点的属性值在所有点中是最小的. SGU 134 即要找出所有的重心,并且找出重心 ...

随机推荐

  1. PHP导出超大的CSV格式的Excel表方案

    场景和痛点 说明 我们工作场景都常会导出相关的excel数据,有时候需要大量的数据,10W,100W都有可能 我们现有方案都是直接利用phpexcel等类库来操作,phpexcel的load加载或是写 ...

  2. Reparameterization Trick

    目录 Sample() is not differentiable Reparameterization trick Too Complex Sample() is not differentiabl ...

  3. 90-Standard Deviation 标准离差指标.(2015.7.4)

    Standard Deviation 标准离差指标 ~计算: StdDev = SQRT (SUM (CLOSE - SMA (CLOSE, N), N)^2)/N 注解: SQRT - 正方体根: ...

  4. 关于Google浏览器Unable to preventDefault inside passive event listener due to target being treated as passive.的解决方案

    最近写react项目的时候,引用了antd-mobile,在使用滚动组件的时候,发现谷歌浏览器会报以下警告 最初我以为是antd-mobile的问题导致的,然后我就无查看了之前的vue的项目,发现了类 ...

  5. 在docker下面安装Nginx PHP mysql let's encrypt

    最近自己在弄了个Nginx PHP Mysql Let's encrypt的docker,下面记录一下 1)先装 Let's encrypt docker run --rm -p 80:80 -p 4 ...

  6. Form表单的action和onSubmit示例介绍

    action是form的属性,onSubmit为事件,要说执行的先后顺序,个人理解是onSubmit在先. 第一:action是form的属性,html5已经将其定义为必需的属性值,onSubmit为 ...

  7. P1547 Out of Hay 洛谷

    https://www.luogu.org/problem/show?pid=1547 题目背景 奶牛爱干草 题目描述 Bessie 计划调查N (2 <= N <= 2,000)个农场的 ...

  8. Servlet处理日期

    以下内容引用自http://wiki.jikexueyuan.com/project/servlet/handling-date.html: 使用Servlet的最重要的优势之一是可以使用核心Java ...

  9. 分享最近抽空写的一个代码生成器,集成EasyDBUtility数据库访问帮助类

    一直想写一个自己的代码生成器,但是因为工作事情多,一直搁置下来,最近下决心终于利用下班时间写完了,现在分享给有需要的朋友,代码生成器集成EasyDBUtility数据库访问帮助类,暂时只支持sqlse ...

  10. 正则表达式lookahead and lookbehind zero-length assertions

    正则表达式非常好的网站: https://www.regular-expressions.info/lookaround.html ---------------------------------- ...