您的位置:首页 > Web前端

bzoj1579 [Usaco2009 Feb]Revamping Trails 道路升级 分层图dij+heap

2017-05-23 16:08 399 查看
明显裸的分层图,居然还TM要dij+heap,白打半天spfa。。。差评(。

不过熟悉了一下dij+heap好评)。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<vector>
#include<queue>
#define inf 1000000000
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define pa pair<int,int>
using namespace std;
typedef long long ll;
int tot,n,m,k;
const int N=2e5+5;
int head
,next
,go
,val
;
int dis
[25];
bool vis
[25];
inline void add(int x,int y,int z)
{
go[++tot]=y;
val[tot]=z;
next[tot]=head[x];
head[x]=tot;
}
inline void dij()
{
priority_queue<pa,vector<pa>,greater<pa> >q;
fo(i,1,n)
fo(j,0,k)dis[i][j]=inf;
memset(vis,0,sizeof(vis));
dis[1][0]=0;
q.push(make_pair(0,1));
while(!q.empty())
{
int x=q.top().second;
q.pop();
int z=x/(n+1);x=x%(n+1);
if (vis[x][z])continue;
vis[x][z]=1;
for(int i=head[x];i;i=next[i])
{
int v;
if (dis[x][z]+val[i]<dis[v=go[i]][z])
{
dis[v][z]=dis[x][z]+val[i];
q.push(make_pair(dis[v][z],z*(n+1)+v));
}
if (z==k)continue;
if (dis[x][z]<dis[v][z+1])
{
dis[v][z+1]=dis[x][z];
q.push(make_pair(dis[v][z+1],(z+1)*(n+1)+v));
}
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
fo(i,1,m)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
dij();
printf("%d\n",dis
[k]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: