POJ 1062 【带约束的最短路问题】
中文题题意不写。
建图:
我自己想到的建图方式是把每个物品看作两个点,编号分别是i和i+n,然后每个物品两个点之间边的权值是物品本身的价值。然后从第i个点往外连边,目标是可替代品顶点编号较小的点,权值为替代之后的优惠费用,然后将可替代品的顶点编号较大的点连向第i+n个顶点,权值是0.
这种建图方法将点的数量增加为原来的两倍,边的数量也相应增加,所以并不是好的建图方法。
大牛的建图方法是把旅行家看作是一个顶点,边的出路是每个物品,权值是每个物品对应的价值,然后当有物品可以有替代物品的时候,连边,起点是替代物,终点是被替代物品,权值是替代后的优惠价格。
这种建图方法更加稠密,同时节点的数量也少。
这道题需要注意的是连接是单向边。
对于约束的处理是,参考了大牛的思想。从第一个节点枚举到第n个节点,以该节点的等级为最低等级,以该节点加m为最高等级,将在这个范围以外的顶点做vis=1的处理,反复进行最短路,取这些最短路的最小值。
#include<stdio.h>
#include<string.h>
int max(int a,int b)
{
if(a>b)
return a;
return b;
}
int min(int a,int b)
{
if(a<b)
return a;
return b;
}
int m,n;
int dis[];
bool vis[];
const int inf=;
int deg[];
int ednum;
struct edge
{
int id,w;
edge *next;
};
edge *adj[];
edge edges[];
inline void addEdge(int a,int b,int c)
{
edge *tmp;
tmp=&edges[ednum];
ednum++;
tmp->id=b;
tmp->w=c;
tmp->next=adj[a];
adj[a]=tmp;
}
void solve(int pos)
{
vis[pos]=;
for(edge *p=adj[pos]; p; p=p->next)
{
if((!vis[p->id]))
{
if((p->w)+dis[pos]<dis[p->id])
{
dis[p->id]=(p->w)+dis[pos];
}
}
}
int next=inf;
int minn=inf;
for(int i=; i<=*n; i++)
{
if(!vis[i]&&minn>dis[i])
{
minn=dis[i];
next=i;
}
}
if(next<=*n)
{
solve(next);
}
}
int main()
{
int num,id,tmon,up,low;
int aa,bb,cc,dd;
int rel=inf;
scanf("%d%d",&m,&n);
for(int i=; i<=n; i++)
{
scanf("%d%d%d",&aa,&bb,&cc);
addEdge(i,i+n,aa);
deg[i]=deg[i+n]=bb;
for(int j=; j<=cc; j++)
{
scanf("%d%d",&id,&tmon);
addEdge(i,id,tmon);
addEdge(id+n,i+n,);
}
}
for(int i=; i<=n; i++)
{
for(int j=; j<=*n; j++)
{
dis[j]=inf;
}
for(int j=; j<=*n; j++)
{
if(deg[j]>=deg[i]&°[j]<=deg[i]+m)
{
vis[j]=;
}
else
{
vis[j]=;
}
}
dis[]=;
solve();
if(rel>dis[+n])
rel=dis[+n];
}
printf("%d\n",rel);
return ;
}
POJ 1062 【带约束的最短路问题】的更多相关文章
- POJ 1062 昂贵的聘礼
C - 昂贵的聘礼 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit St ...
- 最短路POJ 1062 昂贵的聘礼
C - 昂贵的聘礼 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit St ...
- 最短路(Dijkstra) POJ 1062 昂贵的聘礼
题目传送门 /* 最短路:Dijkstra算法,首先依照等级差距枚举“删除”某些点,即used,然后分别从该点出发生成最短路 更新每个点的最短路的最小值 注意:国王的等级不一定是最高的:) */ #i ...
- POJ 1062 昂贵的聘礼(图论,最短路径)
POJ 1062 昂贵的聘礼(图论,最短路径) Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女 ...
- Skiing POJ 3037 很奇怪的最短路问题
Skiing POJ 3037 很奇怪的最短路问题 题意 题意:你在一个R*C网格的左上角,现在问你从左上角走到右下角需要的最少时间.其中网格中的任意两点的时间花费可以计算出来. 解题思路 这个需要发 ...
- POJ 1062 昂贵的聘礼(带限制条件的dijkstra)
题目网址:http://poj.org/problem?id=1062 题目: 昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submis ...
- POJ 1062 昂贵的聘礼 【带限制的最短路/建模】
年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:" ...
- POJ 1724 【存在附加约束的最短路问题】【优先队列】
题意:给K个权值.给含有N个点,R条单向边的图. 每条边都有两个权值,其中一个路长,另外一个是附加权值. 要求路的附加权值之和不超过K的情况下求最短路. 思路: 自己的思路太狭隘,这题还是看了大牛的思 ...
- POJ 1062 ( dijkstra )
http://poj.org/problem?id=1062 一个中文题,一个多月之前我做过,当时我是用搜索写的,不过苦于卡在无法确定等级关系,所以就错了. 看了别人的博客后,我还是不是很理解所谓的枚 ...
随机推荐
- [转]qt QTableWidget&&QTableView 导出数据到excel
转自http://blog.csdn.net/fairystepwgl/article/details/54576372 注意:由于在qt导出的过程中分为QTableWidget导出文件到excel和 ...
- codevs 2905 足球晋级
时间限制: 1 s 空间限制: 64000 KB 题目等级 : 黄金 Gold 题目描述 Description A市举行了一场足球比赛 一共有4n支队伍参加,分成n个小组(每小组4支队伍)进 ...
- bzoj3307 雨天的尾巴 题解(线段树合并+树上差分)
Description N个点,形成一个树状结构.有M次发放,每次选择两个点x,y 对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成 所有发放后,每个点存放最多的是哪种物品. Input ...
- 【整理】解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function
解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function https://www.cnblogs.com/jaso ...
- 二叉排序树BST
注意:对一个二叉排序树进行中序遍历时,得到的序列是一个按值从小到大排列的有序序列 查找性能的分析:
- ionic小白的学习路之目录结构分析、创建组件、创建页面、页面跳转
一. 目录结构分析 hooks:编译cordova 时自定义的脚本命令,方便整合到我们的编译系统和版本控制系统中. node_modules :node 各类依赖包. resources :andro ...
- <c:forEach>实例演示
<c:forEach>实例演示 <%@ page language="java" contentType="text/html; charset=UTF ...
- POJ-3190-分配畜栏
这个题首先,我们需要注意的是它的时间是一秒,其中还包括了你读入数据的时间,因为cin我写的时候没有解除绑定,所以直接超时,我们直接用scanf函数读入50000组数据好了. 然后就是poj交的时候,如 ...
- composer 插件安装
https://packagist.org/?q=phpmyadmin&p=0 Github:笔记 https://github.com/13431/php 类库包下载地址:packagist ...
- 数组合并--php
常用的合并数组方法有以下几种: 1 array_merge 2 '+' 3 array_merge_recursive 下面是一段对比的代码 $array1 = array(2,4," ...