1. 程式人生 > >2018icpc南京賽區網路賽 L 最短路

2018icpc南京賽區網路賽 L 最短路

2018icpc南京賽區網路賽

L 分層圖最短路:題目連結

被卡了pair,然後不知道為什麼錯,最後一直卡到死,賽後pair換成結構體就過了。
應該是出題人為了卡SPFA,所以時限開的這麼狗,而我的堆優化dijkstra也躺槍了。

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+7;
long long dist[N][15];
const long long  inf =  1e18+7;
typedef pair<int,long
long >ppi; int top,head[N*2]; int n,m,k; struct node { int u,v; long long w; int next; } edge[N*2]; struct pp{ int v; long long w; pp(int _v=0,long long _w=0):v(_v),w(_w){} bool operator<(const pp&h)const { return w>h.w; } }; void addedge(int u,int
v,long long w) { edge[top].v = v; edge[top].w = w; edge[top].next = head[u]; head[u] = top++; } void dijkstra() { priority_queue<pp>o; for(int i=1; i<=n; i++) { for(int j=0; j<=12; j++) { dist[i][j] = inf; } } for
(int i=0; i<=10; i++) { dist[1][i] = 0; } o.push(pp(1,0)); while(!o.empty()) { pp tmp =o.top(); // printf("%d%d\n",o.top().first,o.top().second); o.pop(); int u = tmp.v; for(int i=head[u]; i!=-1; i=edge[i].next) { // printf("%d\n",i); int v = edge[i].v; long long w = edge[i].w; if(dist[u][0]+w<dist[v][0]) { dist[v][0] = dist[u][0]+w; o.push(pp(v,dist[v][0])); } for(int j=1; j<=k; j++) { if(dist[u][j]+w<dist[v][j]) { dist[v][j] = dist[u][j]+w; o.push(pp(v,dist[v][j])); } if(dist[u][j-1]<dist[v][j]) { dist[v][j] = dist[u][j-1]; o.push(pp(v,dist[v][j])); } } } } } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&k); memset(head,-1,sizeof(head)); top = 0; for(int i=1; i<=m; i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); addedge(u,v,w); } dijkstra(); // for(int i=1;i<=n;i++) // { // for(int j=0;j<=k;j++) // { // printf("%d ",dist[i][j]); // } // printf("\n"); // } long long ans = inf; for(int i=0;i<=k;i++) { ans = min(dist[n][i],ans); } printf("%lld\n",ans); } return 0; }