zoukankan      html  css  js  c++  java
  • 2018 Benelux Algorithm Programming Contest (BAPC 18)I In Case of an Invasion, Please. . .

    题意:一副无向有权图,每个点有一些人,某些点是避难所(有容量),所有人要去避难所,问最小时间所有人都到达避难所,
    题解:dij+二分+最大流check,注意到避难所最多10个,先挨个dij求到避难所的时间,然后二分时间,在这个时间之内的建边,s向避难所建边,流量是避难所容量,可达的避难所向点建边,流量inf,点向t建边,流量为人的个数,看能不能满流即可,wa点:maxflow里的inf忘改,maxn开小了= =

    //#pragma GCC optimize(2)
    //#pragma GCC optimize(3)
    //#pragma GCC optimize(4)
    //#pragma GCC optimize("unroll-loops")
    //#pragma comment(linker, "/stack:200000000")
    //#pragma GCC optimize("Ofast,no-stack-protector")
    //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define db double
    #define mp make_pair
    #define pb push_back
    #define pi acos(-1.0)
    #define ll long long
    #define vi vector<int>
    #define mod 998244353
    #define ld long double
    //#define C 0.5772156649
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #define pll pair<ll,ll>
    #define pil pair<int,ll>
    #define pli pair<ll,int>
    #define pii pair<int,int>
    #define ull unsigned long long
    //#define base 1000000000000000000
    #define fin freopen("a.txt","r",stdin)
    #define fout freopen("a.txt","w",stdout)
    #define fio ios::sync_with_stdio(false);cin.tie(0)
    inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
    inline void sub(ll &a,ll b){a-=b;if(a<0)a+=mod;}
    inline void add(ll &a,ll b){a+=b;if(a>=mod)a-=mod;}
    template<typename T>inline T const& MAX(T const &a,T const &b){return a>b?a:b;}
    template<typename T>inline T const& MIN(T const &a,T const &b){return a<b?a:b;}
    inline ll qp(ll a,ll b){ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;}
    inline ll qp(ll a,ll b,ll c){ll ans=1;while(b){if(b&1)ans=ans*a%c;a=a*a%c,b>>=1;}return ans;}
    
    using namespace std;
    
    const ull ba=233;
    const db eps=1e-9;
    const ll INF=0x3f3f3f3f3f3f3f3f;
    const int N=100000+100,maxn=4000000+10,inf=0x3f3f3f3f;
    
    vector<pil>v[N];
    ll d[12][N],a[N],b[20];
    priority_queue<pli,vector<pli>,greater<pli>>q;
    void dij(int s,int id)
    {
        memset(d[id],INF,sizeof d[id]);
        d[id][s]=0;
        q.push(mp(d[id][s],s));
        while(!q.empty())
        {
            pli u=q.top();q.pop();
            if(u.fi>d[id][u.se])continue;
            for(pil x:v[u.se])
            {
                if(d[id][u.se]+x.se<d[id][x.fi])
                {
                    d[id][x.fi]=d[id][u.se]+x.se;
                    q.push(mp(d[id][x.fi],x.fi));
                }
            }
        }
    }
    struct edge{
        int to,Next;
        ll c;
    }e[maxn];
    int s,t,cnt,head[N],cur[N];
    void init(){cnt=0;memset(head,-1,sizeof head);}
    void add(int u,int v,ll c)
    {
        e[cnt].to=v;e[cnt].c=c;e[cnt].Next=head[u];head[u]=cnt++;
        e[cnt].to=u;e[cnt].c=0;e[cnt].Next=head[v];head[v]=cnt++;
    }
    int dis[N];
    bool bfs()
    {
        queue<int>q;
        memset(dis,-1,sizeof dis);
        dis[s]=1;q.push(s);
        while(!q.empty())
        {
            int x=q.front();q.pop();
            for(int i=head[x];~i;i=e[i].Next)
            {
                int y=e[i].to;
                if(dis[y]==-1&&e[i].c>0)
                {
                    dis[y]=dis[x]+1;
                    q.push(y);
                }
            }
        }
        return dis[t]!=-1;
    }
    ll dfs(int u,ll mx)
    {
        if(u==t)return mx;
        ll flow=0,f;
        for(int &i=cur[u];~i;i=e[i].Next)
        {
            int x=e[i].to;
            if(dis[x]==dis[u]+1&&e[i].c>0&&(f=dfs(x,min(mx-flow,1ll*e[i].c))))
            {
                e[i].c-=f;
                e[i^1].c+=f;
                flow+=f;
                if(flow==mx)break;
            }
        }
        if(flow==0)dis[u]=-2;
        return flow;
    }
    ll maxflow()
    {
        ll ans=0,f;
        while(bfs())
        {
            for(int i=0;i<=t;i++)cur[i]=head[i];
            while((f=dfs(s,INF)))ans+=f;
        }
        return ans;
    }
    int n,m,c;
    bool ok(ll x)
    {
        init();s=n+c+1,t=n+c+2;
        ll sum=0;
        for(int i=1;i<=c;i++)
        {
            add(s,i,b[i]);
            for(int j=1;j<=n;j++)if(d[i][j]<=x)add(i,c+j,INF);
        }
        for(int i=1;i<=n;i++)add(c+i,t,a[i]),sum+=a[i];
        return maxflow()==sum;
    }
    int main()
    {
        scanf("%d%d%d",&n,&m,&c);
        for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
        for(int i=1;i<=m;i++)
        {
            int a,b;ll c;scanf("%d%d%lld",&a,&b,&c);
            v[a].pb(mp(b,c));v[b].pb(mp(a,c));
        }
        vector<ll>te;
        for(int i=1,x;i<=c;i++)
        {
            scanf("%d%lld",&x,&b[i]),dij(x,i);
            for(int j=1;j<=n;j++)te.pb(d[i][j]);
        }
        sort(te.begin(),te.end());te.erase(unique(te.begin(),te.end()),te.end());
        int l=-1,r=te.size();
        while(l<r-1)
        {
            int mid=(l+r)>>1;
            if(ok(te[mid]))r=mid;
            else l=mid;
        }
        printf("%lld
    ",te[r]);
        return 0;
    }
    /********************
    
    ********************/
    
  • 相关阅读:
    js字符串分割
    Maven打包出错Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test
    Kafka
    linux 切换PHP版本
    linux 查看服务状态及开发端口
    php消息队列
    windows 设置composer 淘宝镜像
    PHP使用CURL详解
    linux php7.0 安装redis扩展
    linux 快速查找安装目录方法
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/10214137.html
Copyright © 2011-2022 走看看