昂贵的聘礼 poj 1062 Dijkstra

中文题,题意就不多说了,讲讲思路吧,先根据题意构图,与普通最短路不同的是这一题加了一个Rank,每个点都有一个Rank,题目要求最短路径上的点的Rank的最大差值在

M范围内,Dijkstra判断条件时加上Rank约束就行了。我没有添加汇点直接写的,另贴上别人添加汇点的写法。

我的代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#pragma comment (linker,"/STACK:102400000,102400000")
#define maxn 1005
#define MAXN 2005
#define mod 1000000009
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-6
typedef long long ll;
using namespace std;

int mp[110][110];
int visit[110],dist[110],selfcost[110],Rank[110];
int M,N;

int Dijkstra(int s,int e)
{
    int i,j,now,mi;
    memset(visit,0,sizeof(visit));
    memset(dist,INF,sizeof(dist));
    for (i=1;i<=N;i++)
        if (Rank[i]>=s&&Rank[i]<=e)
            dist[i]=mp[1][i];
    dist[1]=0;
    visit[1]=1;
    for (i=1;i<=N;i++)
    {
        now=-1;
        mi=INF;
        for (j=1;j<=N;j++)
        {
            if (Rank[j]>=s&&Rank[j]<=e&&!visit[j]&&dist[j]<mi)
            {
                now=j;
                mi=dist[j];
            }
        }
        if (now==-1)
            break;
        visit[now]=1;
        for (j=1;j<=N;j++)
        {
            if (Rank[j]>=s&&Rank[j]<=e&&!visit[j]&&mp[now][j]<INF&&dist[j]>dist[now]+mp[now][j])
                dist[j]=dist[now]+mp[now][j];
        }
    }
    int minn=INF;
    for (i=1;i<=N;i++)
    {
//        printf("%d\n",dist[i]);
        if (dist[i]+selfcost[i]<minn)
            minn=dist[i]+selfcost[i];
    }
    return minn;
}

int main()
{
    int i,j;
    while (scanf("%d%d",&M,&N)!=EOF)
    {
        for (i=1;i<=N;i++)
            for (j=1;j<=N;j++)
        {
            if (i==j)
                mp[i][j]=0;
            else
                mp[i][j]=INF;
        }
        for (i=1;i<=N;i++)
        {
            int X;
            scanf("%d%d%d",&selfcost[i],&Rank[i],&X);
            while (X--)
            {
                int y,w;
                scanf("%d%d",&y,&w);
                mp[i][y]=w;
            }
        }
        int minn=INF;
        for (int i=Rank[1]-M;i<=Rank[1];i++)
        {
            int xxx=Dijkstra(i,i+M);
            if (xxx<minn)
                minn=xxx;
        }
        printf("%d\n",minn);
    }
    return 0;
}

别人添加会点的代码:

http://www.cnblogs.com/yongze103/archive/2010/08/19/1803757.html

#include<iostream>
using namespace std;

int M,N,dengji[110];
int dis[110],map[110][110];
bool vis[110];

void dijkstra(int m,int n)
{
    int i,k,num=1;
    int min;
    memset(vis,0,sizeof(vis));
    memset(dis,127,sizeof(dis));
    vis[0]=1;
    for(i=0;i<=N;i++)
        if( dengji[i]>=m && dengji[i]<=n)
            dis[i]=map[0][i];
        k=0;
        while(1)
        {
            min=99999999;
            for(i=0;i<=N;i++)
                if(dengji[i]>=m && dengji[i]<=n && !vis[i] && min>dis[i])
                {
                    min=dis[i];
                    k=i;
                }
                vis[k]=1;
                if(k==1)
                    return;
            for(i=0;i<=N;i++)
                if( dengji[i]>=m && dengji[i]<=n && !vis[i] && dis[i]>dis[k]+map[k][i])
                {
                    dis[i]=dis[k]+map[k][i];
                }
        }
}

int main()
{
    int i,j,k,t,p;
    memset(map,127,sizeof(map));
    cin>>M>>N;
    int ans=999999999;
    for(i=1;i<=N;i++)
    {
        scanf("%d%d%d",&map[0][i],&dengji[i],&k);
        for(j=1;j<=k;j++)
        {
            scanf("%d%d",&t,&p);
            map[t][i]=p;
        }
    }
    for( i=dengji[1]-M; i<=dengji[1]; i++)
    {
        dijkstra(i,i+M);
        if(ans>dis[1])
            ans=dis[1];
    }
    cout<<ans<<endl;
    return 0;
}
时间: 2024-10-26 05:19:14

昂贵的聘礼 poj 1062 Dijkstra的相关文章

昂贵的聘礼 - poj 1062 (Dijkstra+枚举)

Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39976   Accepted: 11596 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5000金币就行了.

昂贵的聘礼 POJ - 1062

#include<iostream> #include<queue> #include<cstring> using namespace std; const int N=1e6+10,INF=0x3f3f3f3f; int h[N],ne[N],e[N],w[N],idx; int dist[N]; bool st[N]; int n,m,s=0; int grade[N]; void add(int a,int b,int c) { e[idx]=b; w[idx]

POJ - 1062 昂贵的聘礼(最短路Dijkstra)

昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %I64d & %I64u SubmitStatus Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要

poj 1062 昂贵的聘礼 最短路 dijkstra

#include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <t

POJ 1062 dijkstra + 枚举

这题从下午七点做到晚上的九点半,才做出来. 题意,有一个人A,要去人B那里买东西,人B说了一个价格,然后说如果你能把人C的东西弄来,再加上一部分钱(比直接买人B东西的价格少),也能买到. 于是人A又去了人C那里,人C说了同上的话.依次类推. 但是这个交易圈子里有个规定,就是每个人都有一个等级,如果两个人相差k个等级以上,是不能产生直接或者间接交易的. 问最后你一定要买到人A的东西,最少要多少钱. 分析,分析过后,可以通过交易关系,A需要B的东西,将一条边由B连上A,建立有向图.如果没有等级制度,

poj 1062 昂贵的聘礼 (dijkstra最短路)

题目链接:http://poj.org/problem?id=1062 昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 36799   Accepted: 10616 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的

POJ 1062 昂贵的聘礼(带限制条件的dijkstra)

题目网址:http://poj.org/problem?id=1062 题目: 昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 49916   Accepted: 14961 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到

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

昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 38474   Accepted: 11132 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5000

poj 1062 昂贵的聘礼 [dijkstra]

昂贵的聘礼 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5000金币就行了."探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格.探险家于是又跑到其他地方,其他人也提出