uva 10740 Not the Best 两点之间的K短路径
来源:互联网 发布:网络兼职插画师 编辑:程序博客网 时间:2024/06/07 20:56
题意:
给一张图,求解两点之间的K短路径 如果不存在,输出-1
解题思路:
不会。。。。套模板:A*+SPFA
code:
#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<queue>using namespace std;//int n,m;const int N = 105, M=1005;const int INF = 0x3f3f3f3f;struct node{ int to, w, next;};node edge[M],edge1[M];int head[N], dist[N], outq[N], head1[N], tot, tot1;bool vis[N];bool SPFA(int s, int n ){ int i,k; for(i=0;i<=n;i++) dist[i]=INF; memset(vis,0,sizeof(vis)); memset(outq,0,sizeof(outq)); queue<int > q; while(!q.empty()) q.pop(); vis[s]=1; dist[s]=0; q.push(s); while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=0; outq[u]++; if(outq[u]>n) return 0 ; k=head1[u]; while(k>=0) { if(dist[edge1[k].to]-edge1[k].w>dist[u]) { dist[edge1[k].to]=dist[u]+edge1[k].w; if(!vis[edge1[k].to]) { vis[edge1[k].to]=1; q.push(edge1[k].to); } } k=edge1[k].next; } } return 1;}struct Node1{ int to; int g,f; bool operator<(const Node1 &r) const { if(r.f==f) return r.g<g; return r.f<f; }};int a_star(int start, int End, int k,int n){ Node1 e,ne; int cnt=0; priority_queue<Node1> que; while(!que.empty()) que.pop(); if(start==End) k++; if(dist[start]==INF) return -1; e.to=start; e.g=0; e.f=e.g+ dist[e.to]; que.push(e); while(!que.empty()) { e= que.top(); que.pop(); if(e.to==End) cnt++; if(cnt==k) return e.g; for(int i=head[e.to];i!=-1;i=edge[i].next) { ne.to=edge[i].to; ne.g=e.g+ edge[i].w; ne.f=ne.g+ dist[ne.to]; que.push(ne); } } return -1;}void addedge(int i,int j,int w){ edge[tot].to=j; edge[tot].w=w; edge[tot].next=head[i]; head[i]=tot++;}void addedge1(int i,int j,int w){ edge1[tot1].to=j; edge1[tot1].w=w; edge1[tot1].next=head1[i]; head1[i]=tot1++;}void init(){ tot=0;tot1 = 0; memset(head,-1,sizeof(head)); memset(head1,-1,sizeof(head1));}int main(){ int n,m; while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0)break; init(); int S,T,K; scanf("%d%d%d",&S,&T,&K); int a,b,c; for(int i = 0; i < m; i++) { scanf("%d%d%d",&a,&b,&c); addedge(a,b,c); addedge1(b,a,c); } SPFA(T,n); int ans = a_star(S,T,K,n); printf("%d\n",ans); } return 0;}
0 0
- uva 10740 Not the Best 两点之间的K短路径
- uva 10740 - Not the Best(第k短路)
- 两点之间的所有最短路径
- Floyed算法求两点之间的最短路径
- ACM-Floyed算法求两点之间的最短路径
- Python-通过Dijkstra计算两点之间的最短路径
- 16. 求两点之间的最短路径
- (intermediate) 最短路(第k短路) UVA 10740 - Not the Best
- 任意两点之间最短路径
- Dijkstra单源最短路径实现 及 Floyd任意两点之间的最短路径
- pgrouting路径分析(任意两点之间的最短路径)
- 使用广度遍历算法寻找两点之间的最短路径
- 任意两点之间的最短路径问题(Floyd-Warshall算法)
- 求任意大小矩阵两点之间的最短路径(回溯)
- 任意两点之间的最短路径问题(Floyd算法)--Java语言
- uva 10740 Not the Best (最短路 A*算法)
- 任意两点间的最短路径
- dijkstra算法求两点之间最短路径
- 深入理解计算机系统 1.3 理解编译系统如何工作是有回报的
- mysql客户端Navicat_Premium_11.0.17_XiaZaiBa.exe导出excel文件
- spring mvc架构分析
- 不要学习代码,要学会思考
- 呵呵,类
- uva 10740 Not the Best 两点之间的K短路径
- RFID系统组成及其功能
- WebSocket学习笔记一
- One Cause of Nginx 502 Bad Gateway
- CentOS 5下安装perl module以支持IPV6
- 说说Android应用的persistent属性
- Maven/SBT常用的repositorie一览表
- 一个带按钮的自定义Android通知栏DEMO
- 2012,再回首。出错了