首页 > 代码库 > poj 1062 昂贵的聘礼 最短路
poj 1062 昂贵的聘礼 最短路
中文题 题意就不说了,注意题目里说的是所有的人等级差不能超过一个值,而不是两个两个之间不能超过(这里题意搞错了wa半天),
建好图,枚举可以在这个最短路里的最高级和最低级再跑最短路 得到最小值就可以了。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 #define INF 99999999 7 struct node{int price,rank1;}p[1002]; 8 int g[102][102],d[102]; 9 bool vis[102];10 11 int dij(int s,int n,int min1,int max1)12 {13 int minn,mini;14 for(int i=1;i<=n;i++)15 d[i]=INF;16 memset(vis,false,sizeof(vis));17 d[s]=0;18 for(int k=1;k<n;k++)19 {20 minn=INF;21 for(int i=1;i<=n;i++)22 if(!vis[i]&&d[i]<minn)23 {24 minn=d[i];25 mini=i;26 }27 vis[mini]=true;28 for(int i=1;i<=n;i++)29 if(p[i].rank1>=min1&&p[i].rank1<=max1&&d[mini]+g[mini][i]<d[i])30 d[i]=d[mini]+g[mini][i];31 }32 minn=INF;33 for(int i=1;i<=n;i++)34 {35 d[i]+=p[i].price;36 if(minn>d[i])37 minn=d[i];38 }39 return minn;40 }41 42 int main()43 {44 int n,k,c,a,b;45 while(~scanf("%d%d",&c,&n))46 {47 for(int i=0;i<=n;i++)48 for(int j=0;j<=n;j++)49 g[i][j]=INF;50 for(int i=1;i<=n;i++)51 {52 scanf("%d%d%d",&p[i].price,&p[i].rank1,&k);53 while(k--)54 {55 scanf("%d%d",&a,&b);56 g[i][a]=min(b,g[i][a]);57 }58 }59 int temp,ans=INF;60 temp=p[1].rank1;61 temp=max(p[1].rank1-c,0);62 for(int i=temp;i<=p[1].rank1;i++)63 {64 int pp;65 pp=dij(1,n,i,i+c);66 if(pp<ans)67 ans=pp;68 }69 printf("%d\n",ans);70 }71 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。