bzoj 2662: [BeiJing wc2012]冻结

来源:互联网 发布:产品图册制作软件 编辑:程序博客网 时间:2024/05/15 00:27

题意:

能开挂的最短路。

题解:

随便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[n][i]);    printf("%d",ans);}
原创粉丝点击