求助(为什么没输出) 玄关
  • 板块CF1187G Gang Up
  • 楼主CAICAIA
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/4/5 09:26
  • 上次更新2024/4/5 12:04:29
查看原帖
求助(为什么没输出) 玄关
704655
CAICAIA楼主2024/4/5 09:26
#include<bits/stdc++.h>
using namespace std;
const long long MX_N=501000,MX_M=501000,INF=0x3f3f3f3f3f3f3f3f;
const long long tim=100;
struct node{
    long long to,next;
    long long w,cost;
}edge[MX_M<<1];
long long head[MX_N]={0},edge_cnt=0;
inline void Add(long long x,long long y,long long w,long long c){
    node& it=edge[edge_cnt];
    it.cost=c;it.next=head[x];it.w=w;it.to=y;
    head[x]=edge_cnt++;
}

inline void add(long long x,long long y,long long w,long long c){
    Add(x,y,w,c),Add(y,x,0,-c);
}
long long s=0,t=MX_N-1;
long long pre[MX_N]={0},lim[MX_N]={0},dist[MX_N]={0};
bool vis[MX_N]={0};
bool spfa(){
    for(long long i=0;i<MX_N;i++)  lim[i]=0,vis[i]=0,dist[i]=INF;
    queue<long long >qu;
    qu.push(s);lim[s]=INF,vis[s]=1,dist[s]=0;
    while(!qu.empty()){
        long long now=qu.front();qu.pop();vis[now]=0;
        // printf("now %lld\n",now);
        for(long long i=head[now];~i;i=edge[i].next){
            long long to=edge[i].to,w=edge[i].w,cost=edge[i].cost;
            if(w&&dist[to]>dist[now]+cost){
                dist[to]=dist[now]+cost;
                pre[to]=i;
                lim[to]=min(lim[now],w);
                if(!vis[to]){
                    qu.push(to);
                    vis[to]=1;
                }
            }
        }
    }
    return lim[t]>0;
}
void EK(long long &flow,long long &cost){
    flow=cost=0;
    while(spfa()){
        flow+=lim[t];
        cost+=lim[t]*dist[t];
        for(long long i=t;i!=s;i=edge[pre[i]^1].to){
            edge[pre[i]].w-=lim[t];
            edge[pre[i]^1].w+=lim[t];
        }
    }
}
long long n,m,k,c,d;
inline long long has(long long now,long long tim){
    return tim*n+now;
}
signed main(){
    memset(head,-1,sizeof(head));
    scanf("%lld%lld%lld%lld%lld",&n,&m,&k,&c,&d);
    long long sum=0;
    for(long long i=1;i<=k;i++){
        long long ai;scanf("%lld",&ai);
        sum+=ai;
        add(s,has(ai,0),1,0);
    }
    for(long long i=1;i<=m;i++){
        long long u,v;scanf("%lld%lld",&u,&v);
        for(long long j=0;j<=tim;j++){
            for(long long x=1;x<=sum;x+=2){
                add(has(u,j),has(v,j+1),1,d*x);
                add(has(v,j),has(u,j+1),1,d*x);
            }
        }
    }
    for(long long i=1;i<=n;i++){
        for(long long j=0;j<tim;j++){
            add(has(i,j),has(i,j+1),INF,0);
        }
    }
    for(long long j=0;j<=tim;j++)  add(has(1,j),t,INF,c*j);
    long long flow=0,cost=0;
    EK(flow,cost);
    printf("%lld",cost);
    return 0;
}//CF1187G

数据:

50 49 49 1 1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
10 11
11 12
12 13
13 14
14 15
15 16
16 17
17 18
18 19
19 20
20 21
21 22
22 23
23 24
24 25
25 26
26 27
27 28
28 29
29 30
30 31
31 32
32 33
33 34
34 35
35 36
36 37
37 38
38 39
39 40
40 41
41 42
42 43
43 44
44 45
45 46
46 47
47 48
48 49
49 50
2024/4/5 09:26
加载中...