POJ 1062 Dijkstra

原创 2016年08月28日 21:12:18

POJ少有的中文题 (很久之前就想写来着,但是原来不会啊…..)
思路:
首先我们可以新建一个点,从这个点向每个物品连一条权值为这个物品价值的边 (这样就把点权转化成了边权对吧……)
我们已经知道了一个物品的替代品是啥,那么就可以从每个替代品向这个物品连一条边权为替代品价值的边。
是不是很有道理。。。

随后枚举区间 (区间里得包括酋长的地位)

每次枚举从新建的点向一号点跑一遍Dijkstra就OK了。

//By SiriusRen
#include <queue>
#include <cstdio>
#include <cstring>
#define N 100050
using namespace std;
int n,m,xx,yy,zz,ww,vis[105],d[105],answer=0x3fffffff;
int tot=0,first[105],next[N],v[N],w[N],p[105];
void add(int from,int to,int weight){
    v[tot]=to;w[tot]=weight;
    next[tot]=first[from];first[from]=tot++;
}
struct Node{int position,weight;}top,jy;
bool operator < (Node a,Node b){
    return a.weight>b.weight;
}
priority_queue<Node>pq;
int main(){
    scanf("%d%d",&m,&n);
    memset(first,-1,sizeof(first));
    for(int i=1;i<=n;i++){
        scanf("%d%d%d",&xx,&p[i],&zz);
        add(0,i,xx);
        while(zz--){
            scanf("%d%d",&xx,&ww);
            add(xx,i,ww);
        }
    }
    for(int T=-m;T<=0;T++){
        memset(d,0x3f,sizeof(d));
        memset(vis,0,sizeof(vis));
        xx=p[1]+T;yy=p[1]+T+m;
        d[0]=jy.position=0,jy.weight=0;pq.push(jy);
        while(!pq.empty()){
            top=pq.top();pq.pop();
            if(vis[top.position])continue;
            vis[top.position]=1;
            for(int i=first[top.position];~i;i=next[i])
            {
                if(d[v[i]]>d[top.position]+w[i]&&!vis[v[i]]&&p[v[i]]>=xx&&p[v[i]]<=yy)
                {
                    d[v[i]]=d[top.position]+w[i];
                    jy.position=v[i];
                    jy.weight=top.weight+w[i];
                    pq.push(jy);
                }
            }
        }
        answer=min(answer,d[1]);
    }
    printf("%d\n",answer);
}

这里写图片描述

版权声明:本文由SiriusRen原创,未经允许不得转载

poj 1062 昂贵的聘礼 Dijkstra算法,中等难度,,,内有测试数据,一道让我累觉不爱的题目

昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 38474   Accepted: 11132 ...
  • Lionel_D
  • Lionel_D
  • 2015年02月21日 16:15
  • 1765

poj1062 Dijkstra

昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44409   Accepted: 13056 ...
  • Summer__show_
  • Summer__show_
  • 2016年06月11日 15:55
  • 200

POJ1062-Expensive dowry

转载请注明出处:優YoU http://user.qzone.qq.com/289065406/blog/1299338542   提示:难得的中文题。。虽然语言相通但是不好解决。。。都说便宜...
  • lyy289065406
  • lyy289065406
  • 2011年07月30日 01:35
  • 8529

poj1062 昂贵的聘礼 最短路

PS:中文题太爽了。。 题意:中文题我就不写题意了。。。 分析:我感觉要注意两点。。。1.注意等级限制,我本来以为只有在相邻的两个人物中有等级的限制,其实在你需要交换的所有人都有等级的限制。。。2.建...
  • liuqiyao_01
  • liuqiyao_01
  • 2013年05月04日 09:35
  • 7192

poj1062 最短路(加限制)

http://poj.org/problem?id=1062 Description 年轻的探险家来到了一个印第安部落里。在那里他和酋长的女儿相爱了,于是便向酋长去求亲。酋长要他用1000...
  • u013573047
  • u013573047
  • 2015年01月09日 20:39
  • 732

POJ Dijkstra入门

POJ2253 题: 题:
  • Since_natural_ran
  • Since_natural_ran
  • 2016年08月04日 17:35
  • 342

poj 1062 dijkstra

哎。。大神就是大神啊。。没有图他就建个图。。没有点他就建个点!!疯了。。我实在是太水了。。。 题解:         建一个点(点0),此题即变为从0到1的最短路。 点0到其他点的权值为若要...
  • onepiecehuiyu
  • onepiecehuiyu
  • 2012年08月21日 20:11
  • 273

POJ 1062题解 Dijkstra

http://poj.org/problem?id=1062 题解: 以b[1].l-m——b[1].l为下界,进行枚举x,每次等级在x——x+m范围之内的才能走通(范围必须卡在m之间)。 求出...
  • u011523796
  • u011523796
  • 2014年12月09日 23:25
  • 258

POJ 1062 枚举+dijkstra()

这道题真TMD恶心,,写了一天,wr了十几次。。。。。。。。崩溃啊。。。。。。各种wr,各种崩溃,最后枚举+dijkstra+优先队列。。。。。。纠结啊。题目: 昂贵的聘礼 ...
  • wmn_wmn
  • wmn_wmn
  • 2012年03月15日 15:14
  • 609

poj1797 - Heavy Transportation(标准的Dijkstra模板题)

题目大意:有n个城市,m条道路,在每条道路上有一个承载量,现在要求从1到n城市最大承载量,而最大承载量就是从城市1到城市n所有通路上的最大承载量 #include #include #define ...
  • acmtl
  • acmtl
  • 2017年02月24日 16:57
  • 222
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 1062 Dijkstra
举报原因:
原因补充:

(最多只允许输入30个字)