您的位置:首页 > 其它

bzoj 2662: [BeiJing wc2012]冻结

2017-09-26 21:43 323 查看

题意:

能开挂的最短路。

题解:

随便spfa保存下冻结了多少次就可以了。

code:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
struct edge{
int y,c,next;
}a[2010];int last[55],len=0;
void ins(int x,int y,int c)
{
a[++len].y=y;a[len].c=c;
a[len].next=last[x];last[x]=len;
}
int n,m,K;
struct node{
int x,k;
};
queue <node> q;
bool u[55][55];
int dis[55][55];
void spfa()
{
node t;t.x=1;t.k=0;
memset(u,false,sizeof(u));
memset(dis,63,sizeof(dis));
u[1][0]=true;dis[1][0]=0;
q.push(t);
while(!q.empty())
{
t=q.front();q.pop();
int x=t.x,k=t.k;
u[x][k]=false;
for(int i=last[x];i;i=a[i].next)
{
int y=a[i].y;
if(k<K)
if(dis[y][k+1]>dis[x][k]+a[i].c/2)
{
dis[y][k+1]=dis[x][k]+a[i].c/2;
if(!u[y][k+1])
{
u[y][k+1]=true;
node tmp;tmp.x=y;tmp.k=k+1;
q.push(tmp);
}
}
if(dis[y][k]>dis[x][k]+a[i].c)
{
dis[y][k]=dis[x][k]+a[i].c;
if(!u[y][k])
{
u[y][k]=true;
node tmp;tmp.x=y;tmp.k=k;
q.push(tmp);
}
}
}
}
}
int main()
{
scanf("%d %d %d",&n,&m,&K);
for(int i=1;i<=m;i++)
{
int x,y,c;scanf("%d %d %d",&x,&y,&c);
ins(x,y,c);ins(y,x,c);
}
spfa();
int ans=(1<<28);
for(int i=0;i<=K;i++) ans=min(ans,dis
[i]);
printf("%d",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: