您的位置:首页 > 其它

poj 1062 昂贵的聘礼 最短路

2014-08-15 19:23 387 查看
中文题 题意就不说了,注意题目里说的是所有的人等级差不能超过一个值,而不是两个两个之间不能超过(这里题意搞错了wa半天),

建好图,枚举可以在这个最短路里的最高级和最低级再跑最短路 得到最小值就可以了。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define INF 99999999
struct node{int price,rank1;}p[1002];
int g[102][102],d[102];
bool vis[102];

int dij(int s,int n,int min1,int max1)
{
int minn,mini;
for(int i=1;i<=n;i++)
d[i]=INF;
memset(vis,false,sizeof(vis));
d[s]=0;
for(int k=1;k<n;k++)
{
minn=INF;
for(int i=1;i<=n;i++)
if(!vis[i]&&d[i]<minn)
{
minn=d[i];
mini=i;
}
vis[mini]=true;
for(int i=1;i<=n;i++)
if(p[i].rank1>=min1&&p[i].rank1<=max1&&d[mini]+g[mini][i]<d[i])
d[i]=d[mini]+g[mini][i];
}
minn=INF;
for(int i=1;i<=n;i++)
{
d[i]+=p[i].price;
if(minn>d[i])
minn=d[i];
}
return minn;
}

int main()
{
int n,k,c,a,b;
while(~scanf("%d%d",&c,&n))
{
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
g[i][j]=INF;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&p[i].price,&p[i].rank1,&k);
while(k--)
{
scanf("%d%d",&a,&b);
g[i][a]=min(b,g[i][a]);
}
}
int temp,ans=INF;
temp=p[1].rank1;
temp=max(p[1].rank1-c,0);
for(int i=temp;i<=p[1].rank1;i++)
{
int pp;
pp=dij(1,n,i,i+c);
if(pp<ans)
ans=pp;
}
printf("%d\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: