题意:每个城市举办庆祝有一定的花费,A在路径上会选择庆祝花费最大的城市

   让你求,A回家所花的路费和庆祝费最少,也就是说并不是最短路径就是结果,

   还有可能就是路费比最短路径的多,但是庆祝费就比它的少,总的加起来可能更小。

思路:枚举每个城市作为庆祝的点,设为x。以x为源点,用dijks求单源路径,路径上如果有大于x庆祝费的点,则不考虑进去。

    求完所有点到x的单源路径后,用两重j、k的for循环,同步更新从j到k所需要的最小花费

#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <cstring>
#include <stdio.h>
#include <map>
#include <vector>
using namespace std;
const int maxn=0x3f3f3f3f; int c,r,q;
int c1,c2,d;
int a,b;
int road[][];
int feast[];
int ans[][];//ans[i][j]即为询问的答案,表示i到j最少的花费
int dis[];//当x为庆祝点时,dis[i]表示以第x城市作为举办宴会的地方,i到x之间的最短路径(即花费);
vector<int> link[];
int vis[];
int cases=;
int blank=; void init(){
for(int i=;i<=c;i++)
link[i].clear();
memset(road,maxn,sizeof(road));
memset(ans,maxn,sizeof(ans));
}
int main()
{
while(scanf("%d%d%d",&c,&r,&q)!=EOF){
if(c== && r== && q==)
break;
//如果不这样,则最后一个case输出完后会多打一个空格,这也给我wrong answer。。。
if(blank)
puts("");
else
blank=;
cases++;
init();
for(int i=;i<=c;i++){
scanf("%d",&feast[i]);
}
for(int i=;i<r;i++){
scanf("%d%d%d",&c1,&c2,&d);
road[c1][c2]=d;
road[c2][c1]=d;
link[c1].push_back(c2);
link[c2].push_back(c1);
} for(int i=;i<=c;i++){ //以i作为庆祝城市,并且以i作为源点,求单源路径
memset(dis,maxn,sizeof(dis));
dis[i]=;
memset(vis,,sizeof(vis)); //循环n次,这里我没用优先级队列
for(int z=;z<=c;z++){
int mincost=maxn;
int idx;
for(int k=;k<=c;k++){
if(vis[k]==){
if(dis[k]<mincost && feast[k]<=feast[i]){
mincost=dis[k];
idx=k;
}
}
}
vis[idx]=;
for(int g=;g<link[idx].size();g++){
int v=link[idx][g];
if(v!=idx){
if(feast[v]<=feast[i] && dis[idx]+road[idx][v]<dis[v]){
dis[v]=dis[idx]+road[idx][v];
}
}
}
} //每次求完以i为庆祝点的单源路径后,与之前比较,更新ans[j][k]的值,
//如果此次,从j到k之间在i点庆祝的花费比之前一次循环中的在i'庆祝的花费要少,则更新
for(int j=;j<=c;j++){
for(int k=;k<=c;k++){
if(feast[i]+dis[j]+dis[k]<ans[j][k]){
ans[j][k]=feast[i]+dis[j]+dis[k];
}
}
} }
printf("Case #%d\n",cases);
for(int i=;i<=q;i++){
scanf("%d%d",&a,&b);
if(ans[a][b]==maxn){
printf("-1\n");
}
else{
printf("%d\n",ans[a][b]);
}
}
//printf("\n"); }
return ;
}

UVA 10246 Asterix and Obelix的更多相关文章

  1. Asterix and Obelix

    uva10246:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&am ...

  2. uva 10246(最短路变形)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28972 思路:spfa求出每个点到其余顶点的最短路(最短路上的每个 ...

  3. UVA 10256 The Great Divide(凸包划分)

    The Great Divide Input: standard input Output: standard output Time Limit: 8 seconds Memory Limit: 3 ...

  4. KMP CF126B Password

    Description Asterix,Obelix和他们的临时伙伴Suffix.Prefix已经最终找到了和谐寺.然而和谐寺大门紧闭,就连Obelix的运气也没好到能打开它. 不久他们发现了一个字符 ...

  5. uva 1354 Mobile Computing ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5

  6. UVA 10564 Paths through the Hourglass[DP 打印]

    UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...

  7. UVA 11404 Palindromic Subsequence[DP LCS 打印]

    UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...

  8. UVA&&POJ离散概率与数学期望入门练习[4]

    POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问 ...

  9. UVA计数方法练习[3]

    UVA - 11538 Chess Queen 题意:n*m放置两个互相攻击的后的方案数 分开讨论行 列 两条对角线 一个求和式 可以化简后计算 // // main.cpp // uva11538 ...

随机推荐

  1. C++将类的构造函数、析构函数声明为private或者protected的用途

    如果将构造函数.析构函数声明为private或者protected,表示不能从类的外部正常调用构造和析构函数了. 这种用法的通常使用的场景如下: 1.如果不想让外面的用户直接构造一个类A的对象,而希望 ...

  2. Apache HTTP Server安装教程

    Apache HTTP Server安装教程 Apache HTTP Server的官方网站是:http://httpd.apache.org/,可以从中下载最新版本的Apache HTTP Serv ...

  3. const char *p、char const *p、char * const p的区别?

    const char *p和char const *p是一样的,都表示定义一个指向字符常量的指针,指针的内容(字符)不可变.char * const p表示一个指向字符的指针常量,字符可以改变,但是指 ...

  4. JAVA设计模式(DESIGN PATTERNS IN JAVA)读书摘要 第1部分接口型模式——第4章 外观(Facade)模式

    外观模式就类似于一个工具包,一个类对应一个功能. 外观模式的意图是为子系统提供一个接口,便于它的使用. 书中给出的例子是画一个哑弹的飞行路径, 初始的类的设计是这样的,看下图, ShowFlight类 ...

  5. 《DDNS服务器的搭建和案例解决方法》

    DDNS原理:DNS + DHCP =DDNS DHCP负责ip解析,和分配给客户机ip,ip为随机数. DNS负责域名解析,A记录里记录了每个ip对应的域名. 客户端ip肯定是变化的,不可能一直使用 ...

  6. easyUI中treegrid组件构造树形表格(简单数据类型)+ssm后台

    这几天做的项目要求用树形表格的形式展示一部分数据,于是就想到了使用easyUI的treegrid组件,但几经翻查各种资料,发现数据类型大多采取标准数据类型,即包含children元素的数据类型,小编查 ...

  7. 计算 sql查询语句所花时间

    --1:下面这种是SQL Server中比较简单的查询SQL语句执行时间方法,通过查询前的时间和查询后的时间差来计算的: declare @begin_date datetimedeclare @en ...

  8. 【转】Class.forName()用法详解

    ref: http://blog.csdn.net/kaiwii/article/details/7405761 主要功能 Class.forName(xxx.xx.xx)返回的是一个类 Class. ...

  9. DevExpress学习笔记1-ProductsDemo.Win

    最近在学习ProductsDemo.Win,有一些体会记录下来,大家分享: 在Contacts模块: 在Private Sub UpdateCurrentContact()过程添加一句:InitInd ...

  10. QQ互联OAuth2.0 .NET SDK 发布以及网站QQ登陆示例代码(转)

    OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容. QQ登录OAuth2 ...