昂贵的聘礼--POJ 1062

1、题目类型:图论、最短路径、dijkstra算法。

2、解题思路:(1)将输入转换为map[][],其中添加汇点t,任何物品都与汇点t相连,权值为其无优惠情况下的金币数;(2)分析知探险家只能在M范围内交易,且M范围必须包含酋长的等级;(3)对满足题意的范围了dijkstra算法寻找最短路径。

3、注意事项:以酋长的等级为立足点考虑M范围。

4、实现方法:

#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;
}

 

posted @ 2010-08-19 17:42  勇泽  阅读(2656)  评论(0编辑  收藏  举报