您的位置:首页 > 编程语言 > Go语言

【JZOJ 4489】【GDOI 2016 Day2】第一题 SigemaGO

2016-06-13 20:04 134 查看

Description





Analysis

这题在GDOI上想到了,可是只有20,so sad

对于那个插近道,只需要做lim次最短路即可。把图分层,插近道相当于从上一层的图走到这一层的图。

当然,这一层本身的最短路也要跑的。

SP(b)FA的时间复杂度O(lim∗n∗一个神奇的常数),dijkstra的是O(lim∗n∗log2n)

Code

#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define efo(i,v) for(int i=last[v];i;i=next[i])
using namespace std;
const int N=10010,M=50010,INF=2139062143;
int n,m,l,tot,to[M],wei[M],next[M],last
,dis[6]
;
bool bz
;
queue<int> q;
struct edge
{
int x,y,z;
}b[M];
bool cmp(edge a,edge b){return a.x<b.x;}
void link(int u,int v,int w)
{
to[++tot]=v,wei[tot]=w,next[tot]=last[u],last[u]=tot;
}
void spfa(int k)
{
bz[1]=1;
memset(dis[k],127,sizeof(dis[k]));
dis[k][1]=0;
q.push(1);
while(!q.empty())
{
int x=q.front();q.pop();
bz[x]=0;
efo(i,x)
{
int y=to[i];
if(dis[k][x]+wei[i]<dis[k][y])
{
dis[k][y]=dis[k][x]+wei[i];
if(!bz[y])
{
bz[y]=1;
q.push(y);
}
}
if(k>0)
efo(j,y)
{
int z=to[j];
if(dis[k-1][x]+l<dis[k][z])
{
dis[k][z]=dis[k-1][x]+l;
if(!bz[z])
{
bz[z]=1;
q.push(z);
}
}
}
}
}
}
int main()
{
freopen("sigemago.in","r",stdin);
freopen("sigemago.out","w",stdout);
int lim,u,v,w;
scanf("%d %d %d %d",&n,&m,&l,&lim);
fo(i,1,m)
{
scanf("%d %d %d",&u,&v,&w);
link(u,v,w);
}
fo(i,0,lim) spfa(i);
printf("%d\n",dis[lim]
==INF?-1:dis[lim]
);
fclose(stdin);fclose(stdout);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: