题目链接:http://poj.org/problem?id=1062
再一次被题意坑了,这次还是中文题。。。。。。
看的题解。
地位差距超过一定限制的两个人之间不会进行任何形式的直接接触,包括交易。他是一个外来人,所以可以不受这些限制。
但是如果他和某个地位较低的人进行了交易,地位较高的的人不会再和他交易,他们认为这样等于是间接接触,反过来也一样。
也就是说:同一条路径上的任意两个人,等级差不能超过M。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #define ll long long 5 using namespace std; 6 const int maxn=110; 7 const int inf=0x3f3f3f3f; 8 int n,m; 9 struct edge 10 { 11 int v,w,nex; 12 }e[maxn*maxn]; 13 int head[maxn]; 14 int cnt; 15 int dis[maxn]; 16 int sta[maxn]; 17 int ins[maxn]; 18 int rk[maxn]; 19 20 void add(int u,int v,int w) 21 { 22 e[cnt].v=v; 23 e[cnt].w=w; 24 e[cnt].nex=head[u]; 25 head[u]=cnt++; 26 } 27 28 int spfa(int s,int r) 29 { 30 for(int i=0;i<=n;i++) 31 { 32 dis[i]=inf; 33 ins[i]=0; 34 } 35 dis[s]=0; 36 ins[s]=1; 37 int top=0; 38 sta[top++]=s; 39 while(top) 40 { 41 int u=sta[--top]; 42 ins[u]=0; 43 for(int i=head[u];i!=-1;i=e[i].nex) 44 { 45 int v=e[i].v; 46 if(rk[v]>m+r||rk[v]<r) continue; 47 int w=e[i].w; 48 if(dis[v]>dis[u]+w) 49 { 50 dis[v]=dis[u]+w; 51 if(!ins[v]) 52 { 53 ins[v]=1; 54 sta[top++]=v; 55 } 56 } 57 } 58 } 59 return dis[1]; 60 } 61 62 int main() 63 { 64 scanf("%d%d",&m,&n); 65 int p,x,y; 66 cnt=0; 67 memset(head,-1,sizeof(head)); 68 for(int i=1;i<=n;i++) 69 { 70 scanf("%d%d%d",&p,&rk[i],&x); 71 add(0,i,p); 72 for(int j=0;j<x;j++) 73 { 74 scanf("%d%d",&y,&p); 75 add(y,i,p); 76 } 77 } 78 int ans=inf; 79 for(int i=1;i<=n;i++) //枚举等级 80 ans=min(ans,spfa(0,rk[i])); 81 printf("%d\n",ans); 82 }
时间: 2024-10-06 13:52:19