Description

On the evening of 3 August 1492, Christopher Columbus departed from Palos de la Frontera with a few ships, starting a serious of voyages of finding a new route to India. As you know, just in those voyages, Columbus discovered the America continent which he thought was India.

Because the ships are not large enough and there are seldom harbors in his route, Columbus had to buy food and other necessary things from savages. Gold coins were the most popular currency in the world at that time and savages also accept them. Columbus wanted to buy N kinds of goods from savages, and each kind of goods has a price in gold coins. Columbus brought enough glass beads with him, because he knew that for savages, a glass bead is as valuable as a gold coin. Columbus could buy an item he need only in four ways below:

1.  Pay the price all by gold coins. 
2.  Pay by ONE glass bead and some gold coins. In this way, if an item’s price is k gold coins, Columbus could just pay k � 1 gold coins and one glass bead. 
3.  Pay by an item which has the same price. 
4.  Pay by a cheaper item and some gold coins.

Columbus found out an interesting thing in the trade rule of savages: For some kinds of goods, when the buyer wanted to buy an item by paying a cheaper item and some gold coins, he didn’t have to pay the price difference, he can pay less. If one could buy an item of kind A by paying a cheaper item of kind B plus some gold coins less than the price difference between B and A, Columbus called that there was a “bargain” between kind B and kind A. To get an item, Columbus didn’t have to spend gold coins as many as its price because he could use glass beads or took full advantages of “bargains”. So Columbus wanted to know, for any kind of goods, at least how many gold coins he had to spend in order to get one � Columbus called it “actual price” of that kind of goods.

Just for curiosity, Columbus also wanted to know, how many kinds of goods are there whose “actual price” was equal to the sum of “actual price” of other two kinds.

 

Input

There are several test cases. 
The first line in the input is an integer T indicating the number of test cases ( 0 < T <= 10). 
For each test case: 
The first line contains an integer N, meaning there are N kinds of goods ( 0 < N <= 20). These N kinds are numbered from 1 to N.

Then N lines follow, each contains two integers Q and P, meaning that the price of the goods of kind Q is P. ( 0 <Q <=N, 0 < P <= 30 ) 
The next line is a integer M( 0 < M <= 20 ), meaning there are M “bargains”.

Then M lines follow, each contains three integers N1, N2 and R, meaning that you can get an item of kind N2 by paying an item of kind N1 plus R gold coins. It’s guaranteed that the goods of kind N1 is cheaper than the goods of kind N2 and R is none negative and less than the price difference between the goods of kind N2 and kind N1. Please note that R could be zero.

 

Output

For each test case: 
Please output N lines at first. Each line contains two integers n and p, meaning that the “actual price” of the goods of kind n is p gold coins. These N lines should be in the ascending order of kind No. .

Then output a line containing an integer m, indicating that there are m kinds of goods whose “actual price” is equal to the sum of “actual price” of other two kinds.

 

Sample Input

1
4
1 4
2 9
3 5
4 13
2
1 2 3
3 4 6
 

Sample Output

1 3
2 6
3 4
4 10
1
 
spfa,认真读题,第四种情况是给定的,也就是说,除了给定的bargain都不能添加
调试经过:1 考虑少了,等价物品交换没考虑到 2 没有明白题目里bargain的意思
感想:坑了一整场,这一份难度是为了读题而给的
思路:
哥伦布的交换一定是从付金币开始,因为除了玻璃珠只有bargain能够减价,而玻璃珠一定要全金币交易,所以一场交易只能用玻璃珠一次
而对于第三种,不添加会断路,从而答案错误
 
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int maxm=50001;
const int maxn=51;
struct edge{
int to,cost,nxt;
}e[maxm];
int first[maxn],price[maxn],m,n,len;
void addedge(int f,int t,int c){
e[len].to=t;e[len].cost=c;e[len].nxt=first[f];
first[f]=len++;
}
void debug(){
for(int i=1;i<=n;i++){
for(int p=first[i];p!=-1;p=e[p].nxt){
int t=e[p].to;
printf("f %d t %d c %d\n",i,t,e[p].cost);
}
}
}
queue<int>que;
void spfa(){
for(int i=1;i<=n;i++)que.push(i);
while(!que.empty()){
int f=que.front();que.pop();
for(int p=first[f];p!=-1;p=e[p].nxt){
int t=e[p].to;
if(price[t]>price[f]+e[p].cost){
price[t]=price[f]+e[p].cost;
que.push(t);
}
}
}
}
int main(){
int caT;
scanf("%d",&caT);
while(caT--){
memset(first,-1,sizeof(first));
memset(price,0x3f,sizeof(price));
scanf("%d",&n);
int f,t,c;
len=0;
for(int i=0;i<n;i++){scanf("%d%d",&f,&c);price[f]=c;}
scanf("%d",&m);
for(int i=0;i<m;i++){scanf("%d%d%d",&f,&t,&c);if(f!=t)addedge(f,t,c);}
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(i!=j&&price[i]==price[j]){addedge(j,i,price[i]-price[j]);addedge(i,j,price[i]-price[j]);}//添加第三种,即等价交换情况边
for(int i=1;i<=n;i++)if(price[i]>0)price[i]--;//直接把玻璃珠在初始值里减去
//debug();
spfa();
for(int i=1;i<=n;i++)printf("%d %d\n",i,price[i]);
int ans=0;
for(int i=1;i<=n;i++){
bool fl=false;
for(int j=1;j<=n;j++){
for(int k=j+1;k<=n;k++){
if(i!=j&&i!=k&&price[j]+price[k]==price[i]){fl=true;break;}
}
if(fl)break;
}
if(fl)ans++;
}
printf("%d\n",ans);
}
return 0;
}

  

hdu 3268 09 宁波 现场 I - Columbus’s bargain 读题 最短路 难度:1的更多相关文章

  1. hdu 3262 09 宁波 现场 C - Seat taking up is tough 暴力 难度:0

    Description Students often have problems taking up seats. When two students want the same seat, a qu ...

  2. hdu 3264 09 宁波 现场 E - Open-air shopping malls 计算几何 二分 圆相交面积 难度:1

    Description The city of M is a famous shopping city and its open-air shopping malls are extremely at ...

  3. hdu 3687 10 杭州 现场 H - National Day Parade 水题 难度:0

    H - National Day Parade Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & % ...

  4. hdu 3682 10 杭州 现场 C To Be an Dream Architect 容斥 难度:0

    C - To Be an Dream Architect Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d &a ...

  5. hdu 4771 13 杭州 现场 B - Stealing Harry Potter's Precious 暴力bfs 难度:0

    Description Harry Potter has some precious. For example, his invisible robe, his wand and his owl. W ...

  6. HDU 4572 Bottles Arrangement(找规律,仔细读题)

    题目 //找规律,123321123321123321…发现这样排列恰好可以错开 // 其中注意题中数据范围: M是行,N是列,3 <= N < 2×M //则猜测:m,m,m-1,m-1 ...

  7. hdu 5071(2014鞍山现场赛B题,大模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5071 思路:模拟题,没啥可说的,移动的时候需要注意top的变化. #include <iostr ...

  8. Columbus’s bargain

    Columbus’s bargain Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  9. hdu 2191 珍惜现在,感恩生活 多重背包入门题

    背包九讲下载CSDN 背包九讲内容 多重背包: hdu 2191 珍惜现在,感恩生活 多重背包入门题 使用将多重背包转化为完全背包与01背包求解: 对于w*num>= V这时就是完全背包,完全背 ...

随机推荐

  1. spring boot由浅入深(一)jdk安装

    1jdk说明 jdk是java提供了运行环境,简单的说就是给java语言制定了规则,并且提供了工具 jdk官网网站:http://www.oracle.com/technetwork/java/jav ...

  2. 模仿Masonary写一个计算器

    1.CaculatorMaker @interface CaculatorMaker : NSObject @property(nonatomic,assign)int result; -(Cacul ...

  3. 比特股-去中心化交易所, STEEM - 去中心化社区, EOS - 下一代智能合约

    libsnark 是实现了 zkSNARK 模式的 C++ 库.zkSNARK 是一个证明/验证计算完整性的加密方法,也即零知识验证的算法, https://github.com/scipr-lab/ ...

  4. POJ1995:Raising Modulo Numbers(快速幂取余)

    题目:http://poj.org/problem?id=1995 题目解析:求(A1B1+A2B2+ ... +AHBH)mod M. 大水题. #include <iostream> ...

  5. Struts2中struts.multipart.maxSize配置

    今天使用Struts2的文件上传控件时,在struts.xml中,将处理上传的action中的fileUpload拦截器的maximumSize参数设置为5000000,上传了一个3M的文件后发现控制 ...

  6. Python笔记 #18# Pandas: Grouping

    10 Minutes to pandas 引 By “group by” we are referring to a process involving one or more of the foll ...

  7. bzoj1609 / P2896 [USACO08FEB]一起吃饭Eating Together(最长不降子序列)

    P2896 [USACO08FEB]一起吃饭Eating Together 显然的最长不升/降子序列,求出最长值,则答案为$n-$最长值(改掉剩下的). 复杂度$O(nlogn)$ (然鹅有神仙写了$ ...

  8. Java堆(heap)、栈(stack)和队列的区别

    Java里面Stack有两种含义: 一:数据结构 Stack,即java.util.Stack import java.util.Stack; import java.util.Iterator; i ...

  9. HDU 2544 最短路(最短路&Floyd)题解

    思路:Floyd模板题,注意一下Floyd核心的三个循环,顺序不要变,我们不能把k放在最内层.因为Floyd是通过不断遍历查找是否有更小的两个路径拼起来能比当前小,如果k在最内层,那么我们就会提前算好 ...

  10. 基于Oracle Sequence的流水号生成规则

    流水号在各种系统中随处可见,一般都是使用自增.年月日时分秒+自增.UUID等,要么纯数字,要么纯字母,这种流水号缺乏一定的辨识度. 下面为大家介绍一种具有辨识度的流水号的生成方式:领域或者应用的标识 ...