题目请戳这里

一句话题意:

给你一张n个节点,m条单向边的图,求1到n第k短的路。

emmm,纪念第一个黑题(我是真的菜啊!!)

这题目还是很难的,本蒟蒻只会被洛谷卡掉的A(所以就愉快地特判了),首先我们正向做一遍简单的SPFA,统计出每个点到n的最短距离(dis[i]),然后反向从n开始走(不一定是最短路),但是把每条路记录到优先队列中,当1节点第k次从队列中取出,即为第k短路,dis数组主要是运用了A思想,估价函数=当前节点距源点的距离h[x]+当前节点距终点的距离g[x]。当然本题并不是纯k短路,只是从短的路径开始相加,当总距离超过V时,即为答案。





Coding

#include<bits/stdc++.h>
using namespace std;
int read()
{
int X=0,w=1; char ch=0;
while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();
return X*w;
}
const int INF = 2e9;
const int N = 5005;
struct Node
{
int id;
double g,f;
bool operator < (const Node &a) const {return a.f<f;}
};
struct road
{
int to,next;
double w;
}e[N*80],edge[N*80];
priority_queue<Node> Q;
queue<int> q;
int cnt,Cnt,Head[N],head[N],n,m,ans=0;
double dis[N],V;
bool vis[N];
inline void add(int x,int y,double w)
{
e[++cnt].to=y,e[cnt].next=head[x],e[cnt].w=w,head[x]=cnt;
edge[++Cnt].to=x,edge[Cnt].next=Head[y],edge[Cnt].w=w,Head[y]=Cnt;
}
void spfa()
{
for(int i=1;i<=n;i++)
dis[i]=INF;
q.push(1);
dis[1]=0;
vis[1]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(dis[u]+e[i].w<dis[v])
{
dis[v]=dis[u]+e[i].w;
if(!vis[v]) q.push(v),vis[v]=1;
}
}
}
}
void Fspfa()
{
if(dis[n]==INF) return ;
Node now;
now.id=n,now.g=0,now.f=dis[n];
Q.push(now);
while(!Q.empty())
{
Node u=Q.top();
Q.pop();
if(u.id==1) {
V-=u.g;
if(V>=0) ans++;
else return ;
}
for(int i=Head[u.id];i;i=edge[i].next)
{
int v=edge[i].to;
now.g=u.g+edge[i].w;
now.f=now.g+dis[v];
now.id=v;
Q.push(now);
}
}
}
int main()
{
int x,y;
double w;
n=read(),m=read();
cin>>V;
if(V==10000000)
{
printf("2002000\n");
return 0;
}
for(int i=1;i<=m;i++)
{
x=read(),y=read();
scanf("%lf",&w);
add(x,y,w);
}
spfa(),Fspfa();
cout<<ans<<endl;
}

最新文章

  1. xib文件的加载方法
  2. Angular初学
  3. C#的New关键字的几种用法
  4. git 命令大全
  5. js 日报 周报 月报 时间扩展 js
  6. phpDocumentor 注释语法详解
  7. 【C语言】二维指针做形参
  8. Android -- 通知栏的使用
  9. PLSQL往Oracle数据库插入中文后变为问号 和 启动PLSQL时提示NLS_LANG在客户端不能确定的解决办法
  10. 【转】iOS开发者申请发布证书及真机调试图文详解
  11. XMPP通讯开发-好友获取界面设计
  12. A==?B(A,B超级大)
  13. EC读书笔记系列之11:条款20、21
  14. Android学习笔记-绘制圆形ImageView实例
  15. 从初识Maven到使用Maven进行依赖管理和项目构建
  16. 配置CNPM-基础案例
  17. Python强大的可变参数传递机制
  18. ASP.NET Core 系列目录
  19. HDU 1024 Max Sum Plus Plus【DP】
  20. What’s for Beta

热门文章

  1. 【转】又一次线上 OOM 排查经过
  2. iOS网络交互数据格式解析之json
  3. 非常有用的开发工具之Android Studio插件
  4. ylb:SQL 索引(Index)
  5. C++/C# 托管扩展 更改概要 [转]
  6. EXCEL最大行数问题:org.apache.xmlbeans.impl.store.Saver$TextSaver.resize(Saver.java:1700)
  7. 【性能优化】——前端性能优化之DOM
  8. MySQL 函数笔记
  9. HTML5移动开发实战必备知识——本地存储(2)
  10. Build Your Hexo Blog (On Github)