THUPC 2024 L题
  • 板块学术版
  • 楼主syLph
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/12/20 16:55
  • 上次更新2023/12/20 20:03:41
查看原帖
THUPC 2024 L题
545026
syLph楼主2023/12/20 16:55

我就是那个交了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;
}
2023/12/20 16:55
加载中...