标签:告诉 head printf empty lan 并且 output 总数 amp
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
题解
用可优惠其他物品的物品去更新其他物品,所以是一个有向图,由于每一个物品都有可能成为使聘礼价格最低的起点,所以将0和所有物品相连,由于等级限制,我们知道一定不可以和比酋长等级低m更多的人交易,同样也不能和比酋长高m更多的人交易,所以枚举等级下限做spfa。
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<queue> 5 #define maxn 105 6 #define inf 1<<29 7 int head[maxn],vis[maxn],d[maxn],ecnt,l[maxn]; 8 int m,n,ans=inf; 9 using namespace std; 10 struct edge{ 11 int u,v,w,next; 12 }E[maxn*maxn]; 13 bool ok(int x,int lim) 14 { 15 if(x>lim+m||x<lim)return false; 16 return true; 17 } 18 void addedge(int u,int v,int w) 19 { 20 E[++ecnt].u=u; 21 E[ecnt].v=v; 22 E[ecnt].w=w; 23 E[ecnt].next=head[u]; 24 head[u]=ecnt; 25 } 26 void spfa(int lim) 27 { 28 queue<int> q; 29 for(int i=1 ; i<=n ; ++i) 30 d[i]=inf; 31 d[0]=0; 32 vis[0]=1; 33 q.push(0); 34 while(!q.empty()) 35 { 36 int x=q.front();q.pop(); 37 vis[x]=0; 38 for(int i=head[x] ; i ; i=E[i].next ) 39 { 40 int v=E[i].v; 41 int w=E[i].w; 42 if(d[v]>d[x]+w&&ok(l[v],lim)) 43 { 44 d[v]=d[x]+w; 45 if(!vis[v]) 46 { 47 vis[v]=1; 48 q.push(v); 49 } 50 } 51 } 52 } 53 } 54 int main() 55 { 56 int u,w,p,x; 57 scanf("%d%d",&m,&n); 58 for(int i=1 ; i<=n ; ++i ) 59 { 60 scanf("%d%d%d",&p,&l[i],&x); 61 addedge(0,i,p); 62 for(int j=1 ; j<=x ; ++j ) 63 { 64 scanf("%d%d",&u,&w); 65 addedge(u,i,w); 66 } 67 } 68 for(int i=l[1]-m;i<=l[1];++i) 69 { 70 spfa(i); 71 ans=min(ans,d[1]); 72 } 73 printf("%d",ans); 74 return 0; 75 }
标签:告诉 head printf empty lan 并且 output 总数 amp
原文地址:http://www.cnblogs.com/fujudge/p/7496782.html