一般求最短路,限制某個條件
Gym 102501A Environment-Friendly Gym 102501A Environment-Friendly
題意:求最小的co2消耗量(最短路可) ,有一個限制條件,路途的距離 不能超過B
思路:dj+dp
代碼:
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <stack>
#include <vector>
#include <set>
#include <map>
#define INF 0x3f3f3f3f3f3f3f3f
#define FILL(a,b) (memset(a,b,sizeof(a)))
#define re register
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(a) ((a)&-(a))
#define ios std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);
#define fi first
#define rep(i,n) for(int i=0;(i)<(n);i++)
#define rep1(i,n) for(int i=1;(i)<=(n);i++)
#define se second
#define MA(a, b) make_pair(a, b)
using namespace std
;
typedef long long ll
;
typedef unsigned long long ull
;
typedef pair
<int,int> pii
;
int dx
[4]= {-1,1,0,0},dy
[4]= {0,0,1,-1};
const ll mod
=10001;
const ll N
=1e3+10;
const double pi
=acos(-1);
const double eps
= 1e-4;
int h
[N
*N
],e
[N
*N
],ne
[N
*N
],idx
,w
[N
*N
];
int B
;
int n
;
struct piont
{int x
,y
;int dis(piont a
){return ceil(sqrt((x
-a
.x
)*(x
-a
.x
)+(y
-a
.y
)*(y
-a
.y
)));}
}a
[N
];
struct node
{int x
,y
,w
;bool operator <(const node
&M
)const{return w
>M
.w
;}
};
int c
[110];
int dis1
[110][N
];
int vis
[110][N
];
void add(int a
,int b
,int w1
)
{w
[idx
]=w1
,e
[idx
]=b
,ne
[idx
]=h
[a
];h
[a
]=idx
++;
}
void dj()
{priority_queue
<node
>q
;for(int i
=0;i
<=B
;i
++){for(int j
=0;j
<n
;j
++)dis1
[i
][j
]=0x3f3f3f3f;dis1
[i
][1001]=0x3f3f3f3f;dis1
[i
][1002]=0x3f3f3f3f;}dis1
[0][1001]=0;q
.push({0,1001,0});while(q
.size()){node t
=q
.top();q
.pop();if(vis
[t
.x
][t
.y
]) continue;vis
[t
.x
][t
.y
]=1;for(int i
=h
[t
.y
];i
!=-1;i
=ne
[i
]){int v1
=e
[i
];int ch
=a
[t
.y
].dis(a
[v1
]);int w1
=w
[i
]*ch
;if(t
.x
+ch
<=B
&&dis1
[t
.x
][t
.y
]+w1
<dis1
[t
.x
+ch
][v1
]){dis1
[t
.x
+ch
][v1
]=dis1
[t
.x
][t
.y
]+w1
;q
.push({t
.x
+ch
,v1
,dis1
[t
.x
+ch
][v1
]});}}
}}
int main()
{FILL(h
,-1);scanf("%d%d%d%d%d%d",&a
[1001].x
,&a
[1001].y
,&a
[1002].x
,&a
[1002].y
,&B
,&c
[0]);int T
;scanf("%d",&T
);rep1(i
,T
) scanf("%d",&c
[i
]);scanf("%d",&n
);rep(i
,n
){int x
;scanf("%d%d%d",&a
[i
].x
,&a
[i
].y
,&x
);rep1(j
,x
){int v
,j1
;scanf("%d%d",&v
,&j1
);add(i
,v
,c
[j1
]);add(v
,i
,c
[j1
]);}}rep(i
,n
){add(i
,1001,c
[0]);add(1001,i
,c
[0]);add(i
,1002,c
[0]);add(1002,i
,c
[0]);}add(1002,1001,c
[0]);add(1001,1002,c
[0]);dj();int any
=0x3f3f3f3f;for(int i
=0;i
<=B
;i
++) any
=min(any
,dis1
[i
][1002]);if(any
==0x3f3f3f3f) printf("-1");else printf("%d",any
);return 0;
}
總結
以上是生活随笔為你收集整理的多层图,dj+dp Gym 102501A Environment-Friendly的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。