标签:
经(luo)典(ti) K短路题目= =
K短路学习:http://www.cnblogs.com/Hilda/p/3226692.html
流程:
先把所有边逆向,做一遍dijkstra,得到估价函数h(x)(x到T的最短路距离)
f(x)=g(x)+h(x)
按f(x)维护一个堆……T第k次出堆时的g(T)即为ans
另外,需要特判:如果S==T,k++
1 Source Code 2 Problem: 2449 User: sdfzyhy 3 Memory: 11260K Time: 141MS 4 Language: G++ Result: Accepted 5 6 Source Code 7 8 //POJ 2449 9 #include<queue> 10 #include<cstdio> 11 #include<cstring> 12 #include<cstdlib> 13 #include<iostream> 14 #include<algorithm> 15 #define rep(i,n) for(int i=0;i<n;++i) 16 #define F(i,j,n) for(int i=j;i<=n;++i) 17 #define D(i,j,n) for(int i=j;i>=n;--i) 18 #define pb push_back 19 using namespace std; 20 typedef long long LL; 21 inline int getint(){ 22 int r=1,v=0; char ch=getchar(); 23 for(;!isdigit(ch);ch=getchar()) if (ch==‘-‘) r=-1; 24 for(; isdigit(ch);ch=getchar()) v=v*10-‘0‘+ch; 25 return r*v; 26 } 27 const int N=1010,M=100010,INF=0x3f3f3f3f; 28 /*******************template********************/ 29 int to[2][M],next[2][M],head[2][N],len[2][M],cnt[2]; 30 void ins(int x,int y,int z,int k){ 31 to[k][++cnt[k]]=y; next[k][cnt[k]]=head[k][x]; head[k][x]=cnt[k]; len[k][cnt[k]]=z; 32 } 33 #define f(i,x,k) for(int i=head[k][x],y=to[k][i];i;i=next[k][i],y=to[k][i]) 34 35 int n,m,K,S,T; 36 int d[N],times[N],from[N],route[N]; 37 bool vis[N]; 38 typedef pair<int,int>pii; 39 #define mp make_pair 40 void dij(){ 41 priority_queue<pii,vector<pii>,greater<pii> >Q; 42 memset(d,0x3f,sizeof d); 43 d[T]=0; 44 Q.push(mp(0,T)); 45 while(!Q.empty()){ 46 int x=Q.top().second; Q.pop(); 47 if (vis[x]) continue; 48 vis[x]=1; 49 f(i,x,0) 50 if (!vis[y] && d[y]>d[x]+len[0][i]){ 51 d[y]=d[x]+len[0][i]; 52 Q.push(mp(d[y],y)); 53 } 54 } 55 // F(i,1,n) printf("%d ",d[i]); puts(""); 56 } 57 58 struct node{ 59 LL w,to; 60 bool operator < (const node &b)const { 61 return w+d[to] > b.w+d[b.to]; 62 } 63 }; 64 LL astar(){ 65 priority_queue<node>Q; 66 memset(times,0,sizeof times); 67 if (d[S]==INF) return -1; 68 Q.push((node){0,S}); 69 while(!Q.empty()){ 70 LL x=Q.top().to,w=Q.top().w; Q.pop(); 71 // printf("%lld %lld\n",x,w); 72 times[x]++; 73 if (x==T && times[T]==K) return w; 74 if (times[x]>K) continue; 75 f(i,x,1) Q.push((node){w+len[1][i],y}); 76 } 77 return -1; 78 } 79 80 int main(){ 81 #ifndef ONLINE_JUDGE 82 freopen("2449.in","r",stdin); 83 freopen("2449.out","w",stdout); 84 #endif 85 n=getint(); m=getint(); 86 F(i,1,m){ 87 int x=getint(),y=getint(),z=getint(); 88 ins(x,y,z,1); ins(y,x,z,0); 89 } 90 S=getint(); T=getint(); K=getint(); 91 if (S==T) K++; 92 dij(); 93 printf("%lld\n",astar()); 94 return 0; 95 }
Time Limit: 4000MS | Memory Limit: 65536K | |
Total Submissions: 23008 | Accepted: 6295 |
Description
Input
Output
Sample Input
2 2 1 2 5 2 1 4 1 2 2
Sample Output
14
Source
[Submit] [Go Back] [Status] [Discuss]
标签:
原文地址:http://www.cnblogs.com/Tunix/p/4528546.html