https://nanti.jisuanke.com/t/31001

题意 可以把k条边的权值变为0,求s到t的最短路

解析  分层最短路  我们建立k+1层图 层与层之间边权为0,i 向 i+1层转移,代表用了一条免费边。

#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(a) (a).begin(), (a).end()
#define fillchar(a, x) memset(a, x, sizeof(a))
#define huan printf("\n");
#define debug(a,b) cout<<a<<" "<<b<<" ";
using namespace std;
const int maxn=3e6+,inf=0x3f3f3f3f;
typedef long long ll;
typedef pair<int,int> pii;
int n,m,k,st,ed,cnt,head[maxn],vis[maxn];
ll dis[maxn];
struct node
{
ll from,to,val,next;
} edge[maxn<<];
struct element
{
ll val,now;
};
bool operator < (element a,element b)
{
if(a.val==b.val)
return a.now<b.now;
return a.val>b.val;
}
void dijikstra(int s,int e)
{
priority_queue<element>q;
memset(dis,0x3f,sizeof(dis));
dis[s]=;
q.push(element{,s});
while(!q.empty())
{
element u=q.top();
q.pop();
if(vis[u.now])
continue;
vis[u.now]=;
for(int i=head[u.now]; i!=-; i=edge[i].next)
{
int to=edge[i].to;
if(dis[u.now]+edge[i].val<dis[to])
{
dis[to]=dis[u.now]+edge[i].val;
q.push(element{dis[to],to});
}
}
}
ll ans=1e18;
for(int i=; i<=k; i++)
{
if(ans>dis[e+i*n])
ans=dis[e+i*n];
}
printf("%lld\n",ans);
}
void init()
{
memset(head,-,sizeof(head));
memset(vis,,sizeof(vis));
cnt=;
}
void edgeadd(ll from,ll to,ll val)
{
edge[cnt].from=from;
edge[cnt].to=to;
edge[cnt].val=val;
edge[cnt].next=head[from];
head[from]=cnt++;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
init();
scanf("%d%d%d",&n,&m,&k);
st=,ed=n;
for(int i=; i<=m; i++)
{
ll x,y,z;
scanf("%lld%lld%lld",&x,&y,&z);
for(int i=; i<=k; i++) //分为k+1层图,
{
edgeadd(x+i*n,y+i*n,z); //每层图之间建边
if(i!=k)
{
edgeadd(x+i*n,y+(i+)*n,);//第层i向i+1层图建边 边权为0;
}
}
}
dijikstra(st,ed);
}
}

BZOJ 2763

dp思想

/**************************************************************
Problem: 2763
User: 1071532391
Language: C++
Result: Accepted
Time:7452 ms
Memory:6972 kb
****************************************************************/ #include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(a) (a).begin(), (a).end()
#define fillchar(a, x) memset(a, x, sizeof(a))
#define huan printf("\n");
#define debug(a,b) cout<<a<<" "<<b<<" ";
using namespace std;
const int maxn=2e4+,inf=0x3f3f3f3f;
typedef long long ll;
typedef pair<int,int> pii;
struct edge
{
int u,v,w,next;
}e[maxn*];
struct node
{
int x,y;
};
int cnt,dis[maxn][],head[maxn],vis[maxn][];
int n,m,k,s,t;
void init()
{
cnt=;
fillchar(head,-);
fillchar(vis,);
}
void addedge(int u,int v,int w)
{
e[++cnt].next=head[u];
e[cnt].u=u;
e[cnt].v=v;
e[cnt].w=w;
head[u]=cnt;
}
void spfa()
{
fillchar(dis,0x3f);
queue<node> q;
q.push(node{s,k});
dis[s][k]=;
while(!q.empty())
{
int u=q.front().x;
int t=q.front().y;
q.pop();
vis[u][t]=;
for(int i=head[u];i!=-;i=e[i].next)
{
int v=e[i].v,w=e[i].w;
if(dis[v][t]>dis[u][t]+w)
{
dis[v][t]=dis[u][t]+w;
if(!vis[v][t])
{
vis[v][t]=;
q.push(node{v,t});
}
}
if(t>&&dis[v][t-]>dis[u][t])
{
dis[v][t-]=dis[u][t];
if(!vis[v][t-])
{
vis[v][t-]=;
q.push(node{v,t-});
}
}
}
}
int ans=1e9;
for(int i=;i<=k;i++)
{
//cout<<dis[i][0]<<" "<<i<<endl;
ans=min(ans,dis[t][i]);
}
printf("%d\n",ans);
}
int main()
{
init();
scanf("%d%d%d%d%d",&n,&m,&k,&s,&t);
for(int i=;i<m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
}
spfa();
return ;
}

ACM-ICPC 2018 南京赛区网络预赛 L && BZOJ 2763 分层最短路的更多相关文章

  1. ACM-ICPC 2018 南京赛区网络预赛 L题(分层最短路)

    题目链接:https://nanti.jisuanke.com/t/31001 题目大意:给出一个含有n个点m条边的带权有向图,求1号顶点到n号顶点的最短路,可以使<=k条任意边的权值变为0. ...

  2. ACM-ICPC 2018 南京赛区网络预赛 L题(分层图,堆优化)

    题目链接: https://nanti.jisuanke.com/t/31001 超时代码: #include<bits/stdc++.h> using namespace std; # ...

  3. ACM-ICPC 2018 南京赛区网络预赛 L. Magical Girl Haze 最短路+分层图

    类似题解 There are NN cities in the country, and MM directional roads from uu to v(1\le u, v\le n)v(1≤u, ...

  4. ACM-ICPC 2018 南京赛区网络预赛 L. Magical Girl Haze

    262144K   There are NN cities in the country, and MM directional roads from uu to v(1\le u, v\le n)v ...

  5. ACM-ICPC 2018 南京赛区网络预赛 L 【分层图最短路】

    <题目链接> 题目大意: 有N个城市,这些城市之间有M条有向边,每条边有权值,能够选择K条边 边权置为0,求1到N的最短距离. 解题分析: 分层图最短路模板题,将该图看成 K+1 层图,然 ...

  6. ACM-ICPC 2018 南京赛区网络预赛 L.Magical Girl Haze(分层最短路)

    There are N cities in the country, and M directional roads from u to v(1≤u,v≤n). Every road has a di ...

  7. ACM-ICPC 2018 南京赛区网络预赛 - L Magical Girl Haze (分层迪杰斯特拉)

    题意:N个点,M条带权有向边,求可以免费K条边权值的情况下,从点1到点N的最短路. 分析:K<=10,用dist[i][j]表示从源点出发到点i,免费j条边的最小花费.在迪杰斯特拉的dfs过程中 ...

  8. 【ACM-ICPC 2018 南京赛区网络预赛 L】Magical Girl Haze

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 定义dis[i][j]表示到达i这个点. 用掉了j次去除边的机会的最短路. dis[1][0]= 0; 在写松弛条件的时候. 如果用 ...

  9. ACM-ICPC 2018 南京赛区网络预赛 L. Magical Girl Haze (分层dijkstra)

    There are NN cities in the country, and MMdirectional roads from uu to v(1\le u, v\le n)v(1≤u,v≤n). ...

随机推荐

  1. Oracle Storage in Action : 删除物理数据文件

    ALTER TABLESPACE XH_DM DROP DATAFILE 'F:\DEV\ORACLE-DATA\ORCL\XH_DM_1.DBF'; SQL> ALTER TABLESPACE ...

  2. sql server 2000备份还原数据库

    转载请注明出处:http://blog.csdn.net/neochan1108/article/details/79248017 备份: -- Create the backup device fo ...

  3. centos6上安装mysql8.0版本

    本博客是采用yum源的方式安装,非常的方便和快捷.(redhat 与centos7 等操作系统都可以采用此方法,步骤大体一致) mysql官网地址:   https://dev.mysql.com 开 ...

  4. Ubuntu 16.04 LTS: apt-get update 失败处理 Aborted (core dumped)

    在Ubuntu 16.04运行sudo apt-get update出现如下错误: rogn@ubuntu:~$ sudo apt-get update Get:1 http://us.archive ...

  5. swift学习——枚举

    swift枚举 1. 枚举基本语法 enum Method { case Add case Sub case Mul case Div } 也可以使用一种更简单的写法 enum Method1{ ca ...

  6. 【详●析】[GXOI/GZOI2019]逼死强迫症

    [详●析][GXOI/GZOI2019]逼死强迫症 脑子不够用了... [题目大意] 在\(2\times N\)的方格中用\(N-1\)块\(2\times 1\)的方砖和\(2\)块\(1\tim ...

  7. 【HIHOCODER 1038】 01背包

    链接 问题描述 且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的时刻了! 小Ho现在手上有M张奖券,而奖品区有N件奖品,分别标号为1到N,其中第i件奖 ...

  8. Ubuntu16.04 搭建svn

    1.安装SVN 安装前先更新一下 sudo apt-get update 接下来安装 sudo apt-get install subversion 2.创建SVN版本库 1.创建home下的svn文 ...

  9. 在JavaScript中获取Map集合中的key和value值(前提是:既不知道key为什么值,也不知道value有哪些值)

  10. Python+selenium鼠标、键盘事件

    鼠标操作 现在的Web产品提供了丰富的鼠标交互方式,例如鼠标右击.双击.悬停.甚至是鼠标拖动等功能,在Webdriver中,将这些关于鼠标操作的方法封装在ActionChains类提供. 1.鼠标右击 ...