您的位置:首页 > 其它

USACO传送门|二维SPFA

2015-10-13 20:57 323 查看
二维SPFA模板,需要的可以学习一下,原创

//BY genskyuine
#include<cstdio>
#include<cstring>
#include<queue>

using namespace std;

const int MAXN=10010;
const int MAXM=50010;

int n,m,k,tot;
int dis[MAXN][25],h[MAXN];
bool vis[MAXN][25];

struct Edge{
int v,w,next;
}e[MAXM<<1];

struct Point{
int dis,id,step;
bool friend operator<(Point a,Point b) {
return a.dis>b.dis;
}
}last,now;

void add(int u,int v,int w) {
e[++tot].v=v;
e[tot].w=w;
e[tot].next=h[u];
h[u]=tot;
}

void spfa(){
memset(dis,0x3f,sizeof(dis));
priority_queue<Point> q;
last.id=1;last.dis=0;last.step=0;
q.push(last);
dis[last.id][last.step]=0;vis[last.id][last.step]=1;
while(!q.empty()) {
now=q.top();
q.pop();
vis[now.id][now.step]=0;
for(int i=h[now.id];i;i=e[i].next) {
if(dis[e[i].v][now.step]>dis[now.id][now.step]+e[i].w) {
dis[e[i].v][now.step]=dis[now.id][now.step]+e[i].w;
if(!vis[e[i].v][now.step]) {
vis[e[i].v][now.step]=1;
q.push((Point){dis[e[i].v][now.step],e[i].v,now.step});
}
}
if(now.step+1<=k&&dis[e[i].v][now.step+1]>dis[now.id][now.step]) {
dis[e[i].v][now.step+1]=dis[now.id][now.step];
if(!vis[e[i].v][now.step+1]) {
q.push((Point){dis[e[i].v][now.step+1],e[i].v,now.step+1});
vis[e[i].v][now.step+1]=1;
}
}
}
}
}

void init(){
int i,u,v,w;
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=m;++i) {
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
spfa();
int ans=0x7fffffff;
for(i=0;i<=k;++i)
if(ans>dis
[i])
ans=dis
[i];
printf("%d",ans);
}

int main(){
init();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  USACO 图论