标签:des style blog http io ar color os sp
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud
Time Limit: 4000MS | Memory Limit: 65536K | |
Total Submissions: 21855 | Accepted: 5958 |
Description
Input
Output
Sample Input
2 2 1 2 5 2 1 4 1 2 2
Sample Output
14
题意:求第K短路
分析:spfa+A*
先spfa反向求最短路,然后根据A*来搞,f(x)=g(x)+h(x)
h(x)表示从终点反向到x点的最短距离,g(x)表示从起点到x的当前距离,在终点出队K次的时候所求的距离即为第K短路。
即我们每次都优先查找当前总的路程最短的路径,则在终点出队K次之后,即为第k短路了
1 #include <iostream> 2 #include <sstream> 3 #include <ios> 4 #include <iomanip> 5 #include <functional> 6 #include <algorithm> 7 #include <vector> 8 #include <string> 9 #include <list> 10 #include <queue> 11 #include <deque> 12 #include <stack> 13 #include <set> 14 #include <map> 15 #include <cstdio> 16 #include <cstdlib> 17 #include <cmath> 18 #include <cstring> 19 #include <climits> 20 #include <cctype> 21 using namespace std; 22 #define XINF INT_MAX 23 #define INF 0x3FFFFFFF 24 #define MP(X,Y) make_pair(X,Y) 25 #define PB(X) push_back(X) 26 #define REP(X,N) for(int X=0;X<N;X++) 27 #define REP2(X,L,R) for(int X=L;X<=R;X++) 28 #define DEP(X,R,L) for(int X=R;X>=L;X--) 29 #define CLR(A,X) memset(A,X,sizeof(A)) 30 #define IT iterator 31 typedef long long ll; 32 typedef pair<int,int> PII; 33 typedef vector<PII> VII; 34 typedef vector<int> VI; 35 int s ,t,k; 36 const int maxn=1010; 37 vector<PII>G[maxn]; 38 vector<PII>rG[maxn]; 39 int dis[maxn]; 40 int used[maxn]; 41 void init(int n) 42 { 43 memset(used,0,sizeof(used)); 44 for(int i=0;i<n;i++) 45 { 46 dis[i]=INF; 47 G[i].clear(); 48 rG[i].clear(); 49 } 50 } 51 void add_edge(int u,int v,int w){ 52 G[u].push_back(make_pair(v,w)); 53 rG[v].push_back(make_pair(u,w)); 54 } 55 void spfa() 56 { 57 queue<int>q; 58 q.push(t); 59 used[t]=1; 60 dis[t]=0; 61 while(!q.empty()) 62 { 63 int u=q.front(); 64 for(int i=0;i<rG[u].size();i++) 65 { 66 int v=rG[u][i].first; 67 int y=rG[u][i].second; 68 if(dis[u]+y<dis[v]) 69 { 70 dis[v]=dis[u]+y; 71 if(!used[v]) 72 { 73 used[v]=1; 74 q.push(v); 75 } 76 } 77 } 78 q.pop(); 79 used[u]=0; 80 } 81 } 82 int A_star() 83 { 84 priority_queue<pair<int,PII>,vector<pair<int,PII> >,greater<pair<int,PII> > >q; 85 q.push(make_pair(dis[s],make_pair(0,s))); 86 CLR(used,0); 87 while(!q.empty()) 88 { 89 pair<int,PII> p=q.top(); 90 q.pop(); 91 int f=p.first; 92 int g=p.second.first; 93 int u=p.second.second; 94 used[u]++; 95 if(used[t]==k)return f; 96 if(used[u]>k)continue; 97 for(int i=0;i<G[u].size();i++) 98 { 99 int v=G[u][i].first; 100 int d=G[u][i].second; 101 q.push(make_pair(g+dis[v]+d,make_pair(g+d,v))); 102 } 103 } 104 return -1; 105 } 106 int main() 107 { 108 ios::sync_with_stdio(false); 109 int n,m; 110 while(cin>>n>>m) 111 { 112 int u,v,w; 113 init(n); 114 for(int i=0;i<m;i++) 115 { 116 cin>>u>>v>>w; 117 add_edge(--u,--v,w); 118 } 119 cin>>s>>t>>k; 120 s--;t--; 121 spfa(); 122 if(s==t)k++; 123 cout<<A_star()<<endl; 124 } 125 return 0; 126 }
[poj2449]Remmarguts' Date(spfa+A*)
标签:des style blog http io ar color os sp
原文地址:http://www.cnblogs.com/fraud/p/4160419.html