题目链接:

POJ:http://poj.org/problem?id=3835

HDU:http://acm.hdu.edu.cn/showproblem.php?pid=3268

Problem 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
 
Source

题意:

哥伦布和别人交易,用金币,交易规则:

1、每次买一个东西能够用一个玻璃珠取代1金币。

2、能够用同样的价格物品进行交换

3、假设对方愿意能够用N1+r金币交换到N2物品。

求最后每件物品的最小价格,而且最后输出有多少个物品价格=其它两个物品价格和。

PS:

首先建立一个源点S,然后连接全部的点,边上的权值为最初的价钱p - 1,然后在可用来交易的物品间建边,权值为R,然后价钱相等的物品再建边,权值为 0 ,求以S为源点的单源多点最短路;

代码例如以下:

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <climits>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <deque>
#include <set>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
#define pi acos(-1.0)
#define INF 0xffffff
#define N 1005
#define M 2005
int n,m,k,Edgehead[N],dis[N];
struct
{
int v,w,next;
} Edge[2*M];
bool vis[N];
int vv[N];
int cont[N];
void Addedge(int u,int v,int w)
{
Edge[k].next = Edgehead[u];
Edge[k].w = w;
Edge[k].v = v;
Edgehead[u] = k++;
}
void SPFA( int start)
{
queue<int>Q;
for(int i = 1 ; i <= n ; i++ )
dis[i] = INF;
dis[start] = 0;
++cont[start];
memset(vis,false,sizeof(vis));
Q.push(start);
while(!Q.empty())//直到队列为空
{
int u = Q.front();
Q.pop();
vis[u] = false;
for(int i = Edgehead[u] ; i!=-1 ; i = Edge[i].next)//注意
{
int v = Edge[i].v;
int w = Edge[i].w;
if(dis[v] > dis[u] + w)
{
dis[v] = dis[u]+w;
if( !vis[v] )//防止出现环,也就是进队列反复了
{
Q.push(v);
vis[v] = true;
}
// if(++cont[v] > n)//有负环
// return -1;
}
}
}
//return dis[n];
}
int main()
{
int t;
int u,v,w;
int n1, n2, r;
int a, p; scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
//scanf("%d%d",&m,&n);//n为目的地
k = 1;
memset(Edgehead,-1,sizeof(Edgehead));
memset(vv,0,sizeof(vv));
for(int i = 1; i <= n; i++)
{
scanf("%d%d",&a,&p);
vv[a] = p;
Addedge(0,a,p-1);
}
scanf("%d",&m);
for(int i = 1 ; i <= m ; i++ )
{
scanf("%d%d%d",&u,&v,&w);
Addedge(u,v,w);
//Addedge(v,u,w);//双向链表
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(i!=j && vv[i]==vv[j])//价钱相等
{
Addedge(i,j,0);//价钱相等权值就是零
Addedge(j,i,0);
}
}
}
SPFA(0);//从点0開始寻找最短路
for(int i = 1; i <= n; i++)
{
printf("%d %d\n",i,dis[i]);
}
memset(vis,0,sizeof(vis));
int num = 0;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
// if(i != j)
// {
for(int k = j+1; k <= n; k++)
{
if(i != j)
{
if(!vis[i] && i!=k && dis[i]==dis[j]+dis[k])
{
vis[i] = true;
num++;
}
}
}
}
// }
}
printf("%d\n",num);
}
return 0;
}

POJ 3835 &amp; HDU 3268 Columbus’s bargain(最短路 Spfa)的更多相关文章

  1. HDU 1535 Invitation Cards(最短路 spfa)

    题目链接: 传送门 Invitation Cards Time Limit: 5000MS     Memory Limit: 32768 K Description In the age of te ...

  2. POJ 2387 Til the Cows Come Home 【最短路SPFA】

    Til the Cows Come Home Description Bessie is out in the field and wants to get back to the barn to g ...

  3. Columbus’s bargain

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

  4. (poj)3268 Silver Cow Party 最短路

    Description One cow ≤ N ≤ ) conveniently numbered ..N ≤ X ≤ N). A total of M ( ≤ M ≤ ,) unidirection ...

  5. POJ 3268 Silver Cow Party 最短路

    原题链接:http://poj.org/problem?id=3268 Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total ...

  6. hdu 1874 畅通工程续(模板题 spfa floyd)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874 spfa 模板 #include<iostream> #include<stdio ...

  7. HDU 3268/POJ 3835 Columbus’s bargain(最短路径+暴力枚举)(2009 Asia Ningbo Regional)

    Description On the evening of 3 August 1492, Christopher Columbus departed from Palos de la Frontera ...

  8. hdu 3268 09 宁波 现场 I - Columbus’s bargain 读题 最短路 难度:1

    Description On the evening of 3 August 1492, Christopher Columbus departed from Palos de la Frontera ...

  9. POJ 3831 &amp; HDU 3264 Open-air shopping malls(几何)

    题目链接: POJ:id=3831" target="_blank">http://poj.org/problem?id=3831 HDU:http://acm.h ...

随机推荐

  1. HFS - 简单的将个人电脑变服务器!

    网络硬盘   HTTP File Server(HFS)是我目前所知道的最简便的P2P文件分享方式,只一个大小为559KB的单文件绿色软件(hfs.exe)就可以在瞬间不经过任何系统设置将一台普通的联 ...

  2. ListView属性解释

    1.android:scrollbarStyle 定义滚动条的样式和位置 参考:http://www.trinea.cn/android/android-scrollbarstyle/ 2.andro ...

  3. 搭建OA平台

    公司没有OA平台的原因是: 1.暂时没有上的必要. 2.总厂有一个web版的用友的OA. 但最近法方总经理提到了共享日历日程的需求. 这个需求的主要要整合的是把outlook的日历功能共享.原来微软是 ...

  4. bootloader启动代码init.s解析----IRQ中断处理函数

    bootloader启动代码init.s解析----IRQ中断处理函数 init.s源代码如下: ;///////////////////////////////////////////// ;opt ...

  5. Android之ksoap2-android详解与调用天气预报Webservice完整实例

    Google为Android平台开发Web Service客户端提供了ksoap2-android项目,在这个网址下载开发包http://code.google.com/p/ksoap2-androi ...

  6. JVM调优总结(十一)-反思

    垃圾回收的悖论 所谓“成也萧何败萧何”.Java的垃圾回收确实带来了很多好处,为开发带来了便利.但是在一些高性能.高并发的情况下,垃圾回收确成为了制约Java应用的瓶颈.目前JDK的垃圾回收算法,始终 ...

  7. Android_简单笔记一

    入门学习Android的简单笔记(已经安装好了开发环境ADT) 一.关于 AndroidManifest.xml文件 1. android:icon和android:label定义了应用程序安装后显示 ...

  8. Ubuntu 安装启动Tomcat

    首先下载ubuntu 的tar包 官网: http://tomcat.apache.org/download-80.cgi 安装启动 1 .下载对应的tar 2 .解压任意文件夹下,更改名字tomca ...

  9. 配置nexus仓库

    Nexus有许多默认仓库:Central,Releases,Snapshots,和3rd Party 1.配置central仓库 Nexus内置了Maven中央代理仓库Central.选择仓库列表中的 ...

  10. VC动态轨迹画线

    分类: 2.4 线程/图形学2010-04-30 22:14 1878人阅读 评论(0) 收藏 举报 文档null 这是一个绘制直线的简单绘图程序,能过实现动态轨迹画线,在拖动时产生临时线来表示可能画 ...