bzoj2662 [BeiJing wc2012]冻结 ——分层图

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2662

分层图;

我也不知道我写的是不是 bfs (dijkstra?)。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int n,m,k,head[55],ct,dis[55][55];
bool vis[55][55];
struct N{
    int to,next,w;
    N(int t=0,int n=0,int w=0):to(t),next(n),w(w) {}
}edge[2005];
struct P{
    int d,f,bh;
    P(int d=0,int f=0,int b=0):d(d),f(f),bh(b) {}
    bool operator < (const P &y) const 
    {
        return d>y.d;//priority_queue 是从大到小排序 
    }
};
priority_queue<P>q;
void add(int x,int y,int z){edge[++ct]=N(y,head[x],z); head[x]=ct;}
void bfs()
{
    memset(dis,0x3f,sizeof dis);
    dis[1][0]=0; q.push(P(0,0,1));
    while(q.size())
    {
        int x=q.top().bh,d=q.top().d,f=q.top().f; q.pop();
        if(vis[x][f])continue;
        vis[x][f]=1;
        if(x==n)
        {
            printf("%d",d);
            return;
        }
        for(int i=head[x];i;i=edge[i].next)
        {
            int u=edge[i].to;
            if(f<k&&!vis[u][f+1]&&dis[u][f+1]>d+edge[i].w/2)
            {
                dis[u][f+1]=d+edge[i].w/2;
                q.push(P(dis[u][f+1],f+1,u));
            }
            if(dis[u][f]>d+edge[i].w&&!vis[u][f])
            {
                dis[u][f]=d+edge[i].w;
                q.push(P(dis[u][f],f,u));
            }
        }
    }
}
int main()
{
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1,x,y,z;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        add(x,y,z); add(y,x,z);
    }
    bfs();
    return 0;
}

 

posted @ 2018-07-05 20:44  Zinn  阅读(170)  评论(0编辑  收藏  举报