D.Dwarf Tower

Vasya在玩一个叫做”Dwarf Tower”的游戏,这个游戏中有n个不同的物品,
它们的编号为1到n。现在Vasya想得到编号为1的物品。
获得一个物品有两种方式:

直接购买该物品,第i件物品花费的钱为ci
用两件其他物品合成所需的物品,一共有m种合成方式。
请帮助Vasya用最少的钱获得编号为1的物品。

【输入格式】
第一行有两个整数n,m(1<=n<=10000,0<=m<=100000),分别表示有n种物品以
及m种合成方式。
接下来一行有n个整数,第i个整数ci表示第i个物品的购买价格,其中
0<=ci<=10^9。
接下来m行,每行3个整数ai,xi,yi,表示用物品xi和yi可以合成物品ai,其
中(1<=ai,xi,yi<=n; ai<>xi, xi<>yi, yi<>ai)

【输出格式】
一行,一个整数表示获取物品 1 的最少花费。

把每一次更新的节点的父亲放入队列中,然后从队列中取一个,在将和他有关的相邻节点相加与他的父亲相比较,如果有更新继续放入队列,直到没有

#include<bits/stdc++.h>
#define sf scanf
#define pf printf
#define si(a) a.size()
#define pii pair<int,int>
#define scf(x) scanf("%d",&x)
#define scff(x,y) scanf("%d%d",&x,&y)
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=a;i>=n;i--)
#define mm(x,b) memset((x),(b),sizeof(x))
#define scfff(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define de(a) cout << #a << " = " << a << endl
#define dd(a) cout << #a << " = " << a << " "
typedef long long ll;
using namespace std;
const double eps=1e-8;
const int N=1e4+2;
int a[N];
int vis[N];

struct node
{
    int pa,fa;
}t;
vector<node> qa[N];
queue<node> q;
queue<int>v;
void solve()
{ 
    while(!v.empty() )
    {
        int tt=v.front();
        v.pop();
        vis[tt]=0;
        int len=qa[tt].size();
        rep(i,0,len)
        {
            t=qa[tt][i];
            if(a[t.fa]>a[t.pa]+a[tt])
            {
                if(vis[t.fa]==0)
                {
                    vis[t.fa]=1;
                    v.push(t.fa);
                }
                a[t.fa]=a[t.pa]+a[tt];
            }
        }
    }
}
int main()
{
//  freopen("dwarf.in","r",stdin);
//  freopen("dwarf.out","w",stdout);
    //输入 
    mm(vis,0);
    int n,m;scff(n,m);
    rep(i,1,n+1)
    scf(a[i]);
    rep(i,0,m)
    {
        int x,y,z;
        scfff(x,y,z);
        if(a[x]>a[y]+a[z])
        {
            if(vis[x]==0)
            v.push(x),vis[x]=1;
            a[x]=a[y]+a[z]; 
        }
        t.fa =x;
        t.pa =y;
        qa[z].push_back(t);
        t.pa =z;
        qa[y].push_back(t);
    }
    solve();
    cout<<a[1];
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/wzl19981116/p/10802576.html