2018icpc南京賽區網路賽 L 最短路
阿新 • • 發佈:2019-02-17
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;
}