Dwarf Tower

                dwarf tower
                           (dwarf.cpp/c/pas)
【问题描述】
Vasya在玩一个叫做"Dwarf Tower"的游戏,这个游戏中有n个不同的物品,它们的编号为1到n。现在Vasya想得到编号为1的物品。
获得一个物品有两种方式:
1. 直接购买该物品,第i件物品花费的钱为ci
2. 用两件其他物品合成所需的物品,一共有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 的最少花费。

【数据规模与约定】
60%的数据,n<=100
100%的数据,n<=10000,m<=100000

#include<cstdio>
#include<queue>
using namespace std;
int n,m;
struct node{
    long long p,next,f;
}s[200002];
long long a[10001],c=0,be[10001],x,y,z;
bool f[10001]={0};
queue<int> d;
void add(int x,int y,int z){
    c++;
    s[c].p=y;//合成z所需要的另一个原料
    s[c].next=be[x];//指向另一个合成方案
    be[x]=c;    //边表,从x开始
    s[c].f=z;//记录父亲;
}
void bfs(int x){//利用spfa的思想进行bfs
    long long xx;
    for(int i=1;i<=n;i++){//所有节点都要进行bfs
        d.push(i);
        f[i]=1;
    }
    while(!d.empty()){
        xx=d.front();
        f[xx]=0;
        d.pop();
        for(int i=be[xx];i;i=s[i].next)
            if(a[xx]+a[s[i].p]<a[s[i].f]){//当前合成方案能够更新父亲节点,就将父亲入队;
                a[s[i].f]=a[xx]+a[s[i].p];
                if(!f[s[i].f]){
                    d.push(s[i].f);
                    f[s[i].f]=1;
                }
            }
    }
}
int main(){
    freopen("dwarf.in","r",stdin);
    freopen("dwarf.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%I64d",a+i);
    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&z,&x,&y);
        add(x,y,z);
        add(y,x,z);//将(x,y)看成一条边,边是双向的
    }
    bfs(1);
    printf("%d\n",a[1]);
    fclose(stdin);
    fclose(stdout);
    return 0;
}

时间: 2024-10-22 15:35:19

Dwarf Tower的相关文章

Codeforces Gym 100269 Dwarf Tower (最短路)

题目连接: http://codeforces.com/gym/100269/attachments Description Little Vasya is playing a new game named "Dwarf Tower". In this game there are n different items,which you can put on your dwarf character. Items are numbered from 1 to n. Vasya want

HNU 12847 Dwarf Tower(最短路+队列优化)

题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12847 解题报告:有n样物品,编号从1到n第i样物品可以通过金币vi买到,同时有m种方法,方法的内容是由两种物品可以构造出另一种物品,现在要你求出得到1物品的价值最小是多少? 当成最短路来解,用邻接表存好m种构造方法,然后用队列里面的点去尝试通过构造的方法使得得到i物品所花的价值更小,如果更新成功,再把更新成功的那个点又加入到队列中. 同时要标记一下这个点是不是正在队列

[HNU4]Dwarf Tower

题意:给你n件物品,每个物品买需要一个价值,m个规则 x,y,z  表示 y z 可以构成 x  ,问你最少要多少构成第一个物品, 解题思路:这里用到图论思想,每有一个点更新就把它加入到队列里面等待松弛,但是还是必须要标记 解题代码: 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 #include <iostream>

Problem D. Dwarf Tower spfa

http://codeforces.com/gym/100269/attachments 首先建图,然后图中每条边的权值是会变化的,是由dis[x] + dis[y]  --->   dis[make],然后就相当于新增加一个原点0,求0到1的最短距离 #include <bits/stdc++.h> #define IOS ios::sync_with_stdio(false) using namespace std; #define inf (0x3f3f3f3f) typedef

F - Dwarf Tower (Gym - 100269D )

- 题目大意 如题所示获得一个物品有两种方式: 1. 直接购买该物品,第i件物品花费的钱为ci 2. 用两件其他物品合成所需的物品,一共有m种合成方式.     问获得1号物品的最少花费. - 解题思路 把每种合成方式当成路径(注意是有向图把每种方式弄成两条边)枚举物品,以第i个物品为起点做spfa,做n次,找出最短路,即最少花费. - 代码 #include<cstdio> #include<algorithm> #include<queue> #include<

8.15 Test Problem Solution.

1.第K小数(number.cpp/c/pas) 题目描述 有两个正整数数列,元素个数分别为N和M.从两个数列中分别任取一个数 相乘,这样一共可以得到N*M个数,询问这N*M个数中第K小数是多少. 输入输出格式 输入格式: 输入文件名为number.in. 输入文件包含三行. 第一行为三个正整数N,M和K. 第二行为N个正整数,表示第一个数列. 第三行为M个正整数,表述第二个数列. 输出格式: 输出文件名为number.out. 输出文件包括一行,一个正整数表示第k小数. 输入输出样例 输入样例

2017.8.15 考试

注:所有题目的时间限制均为 1s ,内存限制均为 256MB . 1 1 .第K K 小数( ( number .cpp/c/pas)[问题描述]有两个正整数数列,元素个数分别为N和M.从两个数列中分别任取一个数相乘,这样一共可以得到N*M个数,询问这N*M个数中第K小数是多少.[输入格式]输入文件名为number.in.输入文件包含三行.第一行为三个正整数N,M和K.第二行为N个正整数,表示第一个数列.第三行为M个正整数,表述第二个数列.[输出格式]输出文件名为number.out.输出文件包

8.15模拟赛

T1.第K小数[问题描述]有两个正整数数列,元素个数分别为N和M.从两个数列中分别任取一个数相乘,这样一共可以得到N*M个数,询问这N*M个数中第K小数是多少.[输入格式]输入文件名为number.in.输入文件包含三行.第一行为三个正整数N,M和K.第二行为N个正整数,表示第一个数列.第三行为M个正整数,表述第二个数列.[输出格式]输出文件名为number.out.输出文件包含一行,一个正整数表示第K小数.[输入输出样例1 1 ]number.in 2 3 41 22 1 3 number.o

UVa 437 The Tower of Babylon

Description Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of this tale have been forgotten. So now, in line with the educational nature of this contest, we will tell you the whole story: The babylonians had n typ