zoukankan      html  css  js  c++  java
  • BZOJ 2260: 商店购物

    Description

    同上题。

    Solution

    双倍经验!

    最近博客好少...来骗骗访问...

    Code

    /**************************************************************
        Problem: 2260
        User: BeiYu
        Language: C++
        Result: Accepted
        Time:8 ms
        Memory:1340 kb
    ****************************************************************/
     
    #include <bits/stdc++.h>
    using namespace std;
     
    inline int in(int x=0,char ch=getchar()) { while(ch>'9' || ch<'0') ch=getchar();
        while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return x; }
     
    const int N = 55;
    const int M = N*N+50;
     
    struct Edge { int fr,to;double v; };
    Edge edge[M];
     
    int n,m,rt;
    int b[N];
    double mic[N];
    double miv[N];
    int pre[N],vis[N],id[N];
     
    void AddEdge(int fr,int to,double v) { edge[++m]=(Edge){ fr,to,v }; }
     
    double Solve(int n) {
        double res=0;
        for(int cnt,tmp;;) {
            for(int i=1;i<=n;i++) miv[i]=1e9,pre[i]=0;
            for(int i=1;i<=m;i++) {
                Edge &e=edge[i];
                if(e.v<miv[e.to]) miv[e.to]=e.v,pre[e.to]=e.fr;
            }
            for(int i=1;i<=n;i++) if(pre[i]) res+=miv[i];
            memset(vis,0,sizeof(vis));
            memset(id,0,sizeof(id));
            vis[0]=tmp=1,cnt=0;
            for(int i=1;i<=n;i++) if(!vis[i]) {
                ++tmp;int u=i;
                for(;!vis[u];u=pre[u]) vis[u]=tmp;
                if(vis[u]==tmp) {
                    ++cnt;
                    for(;!id[u];u=pre[u]) id[u]=cnt;
                }
            }
            if(!cnt) break;
            for(int i=1;i<=n;i++) if(!id[i]) id[i]=++cnt;
            int mm=m;m=0;
            for(int i=1;i<=mm;i++) {
                Edge &e=edge[i];
                if(id[e.fr]!=id[e.to]) AddEdge(id[e.fr],id[e.to],e.v-miv[e.to]);
            }
            n=cnt;
        }return res;
    }
     
    int main() {
        n=in(),rt=n+1;
        for(int i=1;i<=n;i++) {
            double x;scanf("%lf",&x);
            mic[i]=x;
            b[i]=in();
            if(b[i]) AddEdge(rt,i,x);
        }
        for(int k=in();k--;) {
            int x=in(),y=in();
            double z;scanf("%lf",&z);
            if(b[x] && b[y]) {
                AddEdge(x,y,z);
                mic[y]=min(mic[y],z);
            }
        }
        double ans=Solve(n+1);
    //  cout<<ans<<endl;
    //  for(int i=1;i<=n;i++) cout<<mic[i]<<" ";cout<<endl;
        for(int i=1;i<=n;i++) if(b[i]) ans+=(b[i]-1)*mic[i];
        printf("%.2lf
    ",ans);
        return 0;
    }
    

      

  • 相关阅读:
    netframework webapi IogAttribute记录request参数和错误信息
    An error occurred while starting a transaction on the provider connection. See the inner exception for details.
    mvc partialView断点调试问题
    mysql 用行号rownum更新顺序号字段
    sqlserver 导入excel
    vs2017 git凭证问题
    DataTable 转换为List
    Resharper 修改命名空间
    web api解决序列化后返回标准时间带T问题
    获取当前程序的路径
  • 原文地址:https://www.cnblogs.com/beiyuoi/p/6598533.html
Copyright © 2011-2022 走看看