标签:ext 距离 [1] 差距 top while code 表示 style
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,他到每个点的距离为该点的价值,那么我们就是求0-1的最短路了,然后地位等级的话,最后要到1,那么地位值有a[1]-m<=地位值到a[1]+m,那么我们枚举0的地位值是a[1]-m到m,
那么其他点的距离值范围就为0的地位值到a[0]+m,有向图
1 #include<iostream> 2 #include<cstdio> 3 #include<string.h> 4 #include<queue> 5 #include<math.h> 6 #define inf 0x7fffffff 7 using namespace std; 8 const int N=120; 9 10 int m,n; 11 int pp,l,x; 12 struct node{ 13 int to,next,val; 14 }e[50001]; 15 int tot=0,head[N]; 16 int a[N],b[N]; 17 18 void init(){ 19 tot=0; 20 memset(head,-1,sizeof(head)); 21 } 22 23 void add(int u,int v,int z){ 24 e[tot].to=v;e[tot].next=head[u]; 25 e[tot].val=z;head[u]=tot++; 26 } 27 28 struct point{ 29 int id,vval; 30 point(int xx,int yy){ 31 id=xx;vval=yy; 32 } 33 bool operator<(const point &x) const{ 34 return vval>x.vval; 35 } 36 }; 37 38 int dis[N],vis[N]; 39 40 bool check(int x,int d) {if(b[x]>d+m||b[x]<d)return 0;return 1;} 41 42 void hh(int d){ 43 memset(vis,0,sizeof(vis)); 44 memset(dis,127/3,sizeof(dis)); 45 dis[0]=0; 46 priority_queue<point >p; 47 p.push(point(0,0)); 48 while(!p.empty()){ 49 point x1=p.top(); 50 p.pop(); 51 if(vis[x1.id]) continue; 52 vis[x1.id]=1; 53 for(int i=head[x1.id];i!=-1;i=e[i].next){ 54 int v=e[i].to; 55 if(!vis[v]&&check(v,d)&&dis[v]>x1.vval+e[i].val){ 56 dis[v]=x1.vval+e[i].val; 57 p.push(point(v,dis[v])); 58 } 59 } 60 } 61 } 62 63 int main(){ 64 init(); 65 int xx,yy; 66 scanf("%d%d",&m,&n); 67 for(int i=1;i<=n;i++){ 68 scanf("%d%d%d",&pp,&l,&x); 69 a[i]=pp;b[i]=l; 70 add(0,i,pp); 71 for(int j=1;j<=x;j++){ 72 scanf("%d%d",&xx,&yy); 73 add(xx,i,yy); 74 } 75 } 76 int Min=inf; 77 for(int i=b[1]-m;i<=b[1];i++){ 78 hh(i); 79 Min=min(Min,dis[1]); 80 } 81 cout<<Min<<endl; 82 }
标签:ext 距离 [1] 差距 top while code 表示 style
原文地址:http://www.cnblogs.com/hhxj/p/7010985.html