zoukankan      html  css  js  c++  java
  • 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;
    }
    
    
  • 相关阅读:
    【转】 hive简介,安装 配置常见问题和例子
    MapReduce 开发环境搭建(EclipseMyEclipse + Maven)
    Hadoop项目开发环境搭建(EclipseMyEclipse + Maven)
    Eolinker——前置用例的使用
    github------删除Repository
    Git----创建远程分支,并将文件上传到创建的远程分支上
    Git-------常用操作记录
    gitlab和github的区别
    APP线上问题收集信息整理
    缺陷管理协作流程与注意点
  • 原文地址:https://www.cnblogs.com/wzl19981116/p/10802576.html
Copyright © 2011-2022 走看看