Time Limit: 4000MS | Memory Limit: 65536K | |
Total Submissions: 30658 | Accepted: 8378 |
Description
Input
Output
Sample Input
2 2
1 2 5
2 1 4
1 2 2
Sample Output
14
Source
#include<iostream> #include<queue> #include<cstdio> #include<cstring> #include<algorithm> #define INF 0x3f3f3f3f #define MAXN 300000 using namespace std; struct nond{ int g,f,to; bool operator<(const nond &r) const { if(r.f==f) return r.g<g; return r.f<f; } }tmp,opt; int n,m,s,t,k,cnt,tot,tot1; int dis[MAXN],vis[MAXN]; int to[MAXN],cap[MAXN],net[MAXN],head[MAXN]; int to1[MAXN],cap1[MAXN],net1[MAXN],head1[MAXN]; void add(int u,int v,int w){ to[++tot]=v;net[tot]=head[u];cap[tot]=w;head[u]=tot; to1[++tot1]=u;net1[tot1]=head1[v];cap1[tot1]=w;head1[v]=tot1; } void spfa(int s){ queue<int>que1; for(int i=0;i<=n;i++) dis[i]=INF; que1.push(s); vis[s]=1;dis[s]=0; while(!que1.empty()){ int now=que1.front(); que1.pop(); vis[now]=0; for(int i=head1[now];i;i=net1[i]) if(dis[to1[i]]>dis[now]+cap1[i]){ dis[to1[i]]=dis[now]+cap1[i]; if(!vis[to1[i]]){ vis[to1[i]]=1; que1.push(to1[i]); } } } } int Astar(){ priority_queue<nond>que; if(s==t) k++; if(dis[s]==INF) return -1; tmp.g=0; tmp.to=s; tmp.f=dis[s]; que.push(tmp); while(!que.empty()){ tmp=que.top(); que.pop(); if(tmp.to==t) cnt++; if(cnt==k) return tmp.g; for(int i=head[tmp.to];i;i=net[i]){ opt.to=to[i]; opt.g=tmp.g+cap[i]; opt.f=opt.g+dis[to[i]]; que.push(opt); } } return -1; } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int a,b,c; scanf("%d%d%d",&a,&b,&c); add(a,b,c); } scanf("%d%d%d",&s,&t,&k); spfa(t); printf("%d\n",Astar()); }
原文:http://www.cnblogs.com/cangT-Tlan/p/7409848.html