
【题目链接】
.php?id=1975
【算法】
A*求k短路
【代码】
#include<bits/stdc++.h>
using namespace std;
#define MAXN 5010
#define MAXM 200010
const double INF = 1e15;int i,tot,n,m,u,v;
int head[MAXN],rhead[MAXN];
double dist[MAXN];
double w,val;struct Edge
{int to;double w;int nxt;
} e[MAXM<<1];
struct info
{int s;double d;friend bool operator < (info a,info b){return a.d + dist[a.s] > b.d + dist[b.s];}
} ;inline void add(int u,int v,double w)
{tot++;e[tot] = (Edge){v,w,head[u]};head[u] = tot;tot++;e[tot] = (Edge){u,w,rhead[v]};rhead[v] = tot;
}
inline void dijkstra(int s)
{int i,u,v;double w;priority_queue< pair<double,int> > q;static bool vis[MAXN];memset(vis,false,sizeof(vis));while (!q.empty()) q.pop();for (i = 1; i <= n; i++) dist[i] = INF;dist[s] = 0;q.push(make_pair(0,s));while (!q.empty()){u = q.top().second;q.pop();if (vis[u]) continue;vis[u] = true;for (i = rhead[u]; i; i = e[i].nxt){v = e[i].to;w = e[i].w;if (dist[u] + w < dist[v]){dist[v] = dist[u] + w;q.push(make_pair(-dist[v],v));}}}
}
inline int Astar(int s,int t)
{int i,cnt = 0,v;double w,sum = 0;priority_queue< info > q;info cur;while (!q.empty()) q.pop();q.push((info){s,0});while (!q.empty()){cur = q.top();q.pop();if (cur.s == t){if (sum + cur.d <= val) {sum += cur.d;cnt++;} else return cnt;}for (i = head[cur.s]; i; i = e[i].nxt){v = e[i].to;w = e[i].w;q.push((info){v,cur.d+w});}}return 0;
}int main()
{scanf("%d%d%lf",&n,&m,&val);for (i = 1; i <= m; i++){scanf("%d%d%lf",&u,&v,&w);add(u,v,w); }dijkstra(n);printf("%dn",Astar(1,n));return 0;}
转载于:.html
本文发布于:2024-02-05 02:38:02,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170722072962251.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
| 留言与评论(共有 0 条评论) |