我就是那个交了50发的人。 求正解。
#include<bits/stdc++.h>
using namespace std;
const long double PI = acos(-1);
const int maxn = 1000010;
const long double eps = 1e-13;
const int maxm = 1010;
typedef long double ld;
typedef struct{ld x,y,z;} pos;
typedef struct{int idx; ld out;} poi;
int nxt[maxn],head[maxm],ver[maxn],tot = 1;
int d[maxm],now[maxm],flag = 1;
ld K,r,edg[maxn],ee[maxn],q[maxm],inf;
pos pl[maxm];
poi g[maxm];
int n,m,l,s,t,v[maxn];
ld get_dist(pos a,pos b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z));
}
void add(int x,int y,ld z){
ver[++tot] = y,edg[tot] = z,nxt[tot] = head[x],head[x] = tot;
ver[++tot] = x,edg[tot] = 0,nxt[tot] = head[y],head[y] = tot;
}
bool cmp(poi a,poi b){
return a.out - b.out < -eps;
}
bool bfs(){
memset(d,0,sizeof d);
memcpy(now,head,sizeof head);
queue<int> q; q.push(s); d[s] = 1;
while(!q.empty()){
int x = q.front(); q.pop();
for(int i = head[x] ; i ; i = nxt[i]){
int y = ver[i];
if(edg[i] > eps && !d[y] && !v[y]){
d[y] = d[x] + 1;
if(y == t) return 1;
q.push(y);
}
}
} return 0;
}
ld dinic(int x,ld flow){
if(x == t) return flow;
ld rest = flow,k;int i;
for(i = now[x] ; rest > eps && i ; i = nxt[i]){
now[x] = i; int y = ver[i];
if(edg[i] > eps && d[y] == d[x] + 1 && !v[y]){
k = dinic(y,min(rest,edg[i]));
if(!k) d[y] = 0;
if(flag == 1) g[y].idx = y,g[y].out += k;
edg[i] -= k,edg[i^1] += k,rest -= k;
}
}
return flow - rest;
}
ld Dinic(){
ld maxflow = 0,flow = 0;
while(bfs())
while(1) {
flow = dinic(s,inf);
maxflow += flow;
if(flow<eps) break;
}
return maxflow;
}
int main(){
//freopen("b.cpp","r",stdin);
scanf("%d%d%d%d%d",&n,&m,&l,&s,&t);
scanf("%Lf%Lf",&r,&K);
//printf("%.16Lf",inf);
for(int i = 1 ; i <= n ; i ++){
ld a,b; cin >> a >> b >> q[i];
ld t1=a*PI,t2=b*PI;
pl[i]={r*sin(t1)*cos(t2),r*sin(t1)*sin(t2),r*cos(t1)};
}
for(int u = 1 ; u <= m ; u ++){
int i,j; cin >> i >> j;
ld dis = get_dist(pl[i],pl[j]);
ld theta = acos((2.0 * r * r - dis * dis) / (r * r * 2)) * 180.0 / PI;
ld length = 2.0 * PI * r * theta / 360.0;
length = K * q[i] * q[j] / (length) / (length);
add(i,j,length);
add(j,i,length);
inf += length;
}
memcpy(ee,edg,sizeof edg);
int crt = 0;
for(int tt = 1 ; tt <= l ; tt ++){
for(int i = 1 ; i <= n ; i ++) g[i].idx = i,g[i].out = 0;
ld k1 = Dinic();
sort(g+1,g+n+1,cmp);
memcpy(edg,ee,sizeof ee);
for(int i = n ; ; i --){
if(g[i].idx != s && g[i].idx != t) {
v[g[i].idx] = 1;
break;
}
}
}
ld k3 = Dinic();
printf("%.15Lf\n",k3);
return 0;
}