标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 41066 | Accepted: 11959 |
Description
Input
Output
Sample Input
1 4 10000 3 2 2 8000 3 5000 1000 2 1 4 200 3000 2 1 4 200 50 2 0
Sample Output
5250
Source
//这道是中文题,我竟然还理解错了题意.本题的等级差是指 : 最高等级与最低等级的差值,并不是每两个人之间的差值.
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #define INF 200000000 using namespace std; struct node { int u,v,w; } edge[10000]; int num=0; int N,M; int P[2000],L[2000],n[2000]; int t,v; int low[2000],a,b; int has[2000] ; int Bellman(int u0) { for(int i=0; i<=N; i++) low[i]=INF; low[u0]=0; for(int i=0; i<N-1; i++) { int flag=0; for(int j=0; j<num; j++) { if(has[edge[j].u]&&has[edge[j].v]&&low[edge[j].u]+edge[j].w<low[edge[j].v]) { low[edge[j].v]=low[edge[j].u]+edge[j].w; flag=1; } } if(flag==0) break; } int Min=INF; for(int i=1; i<=N; i++) { low[i]+=P[i]; //最小价格为优惠价+拥有优惠价需要花多少钱 if(Min>low[i]) Min=low[i]; } //printf("%d\n",Min); return Min; } int main() { //freopen("in.txt","r",stdin); while(~scanf("%d%d",&M,&N)) { num=0; for(int i=1; i<=N; i++) { scanf("%d%d%d",&P[i],&L[i],&n[i]); for(int j=1; j<=n[i]; j++) { int a,b; scanf("%d%d",&a,&b); edge[num].u=i; edge[num].v=a; edge[num++].w=b; //存入优惠的价格 } } int ans=L[1]; int Min=INF; //最高等级的与最低的等级差不会超过M for(int i=0; i<=M; i++) { memset(has,0,sizeof(has)); for(int j=1; j<=N; j++) { if(ans-L[j]<=M-i&&L[j]-ans<=i) { has[j]=1; } } int k=Bellman(1); if(Min>k) Min=k; } printf("%d\n",Min); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/became_a_wolf/article/details/47802939