第k短路———2018沈阳网络赛 D题
坑点在于:绝对大于的第k短路
板子题
代码:
#include<bits/stdc++.h> using namespace std; #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f typedef long long ll; const int M = 20005, N = 2005; struct Item { int to; int val; int next; } ee[M], ee2[M]; struct Item2 { int to; int g,f; bool operator<(const Item2 &r ) const { if(r.f==f) return r.g<g; return r.f<f; } }; bool vis[N]; int n,m, s,t ,k, cnt, cnt2, dis[N], head[N], head2[N], dis_k1;; void init() { memset(head,-1,sizeof(head)); memset(head2,-1,sizeof(head2)); mes(vis, false); cnt=cnt2=1; } void Add(int from, int to,int val) { ee[cnt].to=to; ee[cnt].val=val; ee[cnt].next=head[from]; head[from]=cnt++; } void Add2(int from, int to,int val) { ee2[cnt2].to=to; ee2[cnt2].val=val; ee2[cnt2].next=head2[from]; head2[from]=cnt2++; } bool Spfa(int s, int n, int head[], Item ee[], int dist[]) { queue<int >Q1; int inq[1010]; for(int i=0;i<=n;i++) { dis[i]=INF; inq[i]=0; } dis[s]=0; Q1.push(s); inq[s]++; while(!Q1.empty()) { int q=Q1.front(); Q1.pop(); inq[q]--; if(inq[q]>n) return false; int k=head[q]; while(k>=0) { if(dist[ee[k].to]>dist[q]+ee[k].val) { dist[ee[k].to]=ee[k].val+dist[q]; if(!inq[ee[k].to]) { inq[ee[k].to]++; Q1.push(ee[k].to); } } k=ee[k].next; } } return true; } int A_solve(int s,int t,int n,int k,int head[],Item ee[],int dist[]) { Item2 e,ne; int cnt=0; priority_queue<Item2>Q; if(s==t) k++; if(dis[s]==INF) return -1; e.to=s; e.g=0; e.f=e.g+dis[e.to]; Q.push(e); while(!Q.empty()) { e=Q.top(); Q.pop(); if(e.to==t) { cnt++; } if(cnt == k-1) { //绝对大 意思是第k条大于最短路的,,而不是大于等于 dis_k1 = e.g; } if(cnt>=k && e.g>dis_k1) { return e.g; } for(int i=head[e.to]; i!=-1; i=ee[i].next) { ne.to=ee[i].to; ne.g=e.g+ee[i].val; ne.f=ne.g+dis[ne.to]; Q.push(ne); } } return -1; } int main() { while(~scanf("%d%d",&n,&m)) { init(); int T; scanf("%d%d%d%d", &s, &t, &k, &T); for(int i=1;i<=m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); Add(a,b,c); Add2(b,a,c); } Spfa(t,n,head2,ee2,dis); int ans = A_solve(s,t,n,k,head,ee,dis); if(n == 1) { puts("yareyaredawa"); } else if(ans==-1 || ans>T) { puts("Whitesnake!"); } else { puts("yareyaredawa"); } } return 0; }