• HDU


    。。。懒得说什么了

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=100000;
    const int inf=1<<30;int To[maxn],Laxt[maxn],Next[maxn],cap[maxn],cost[maxn];
    int S,T,cnt,dis[maxn],ans;
    bool inq[maxn],vis[maxn];
    deque<int>q;
    void add(int u,int v,int c,int cc)
    {
        Next[++cnt]=Laxt[u];Laxt[u]=cnt; To[cnt]=v;cap[cnt]=c;cost[cnt]=-cc;
        Next[++cnt]=Laxt[v];Laxt[v]=cnt; To[cnt]=u;cap[cnt]=0;cost[cnt]=cc;
    }
    bool spfa()
    {
        for(int i=0;i<=T;i++) inq[i]=0;
        for(int i=0;i<=T;i++) dis[i]=inf;
        inq[T]=1; dis[T]=0; q.push_back(T);
        while(!q.empty())
        {
            int u=q.front(); q.pop_front();
            inq[u]=0;
            for(int i=Laxt[u];i;i=Next[i])
            {
                int v=To[i];
                if(cap[i^1]&&dis[v]>dis[u]-cost[i])
                {
                    dis[v]=dis[u]-cost[i];
                    if(!inq[u]){
                        inq[v]=1;
                        if(q.empty()||dis[v]>dis[q.front()]) q.push_back(v);
                        else q.push_front(v);
                    }
                }
            }
        }
        return dis[S]<inf;
    }
    int dfs(int u,int flow)
    {
        vis[u]=1;
        if(u==T||flow==0) return flow;
        int tmp,delta=0;
        for(int i=Laxt[u];i;i=Next[i])
        {
            int v=To[i];
            if((!vis[v])&&cap[i]&&dis[v]==dis[u]-cost[i])
            {
                tmp=dfs(v,min(cap[i],flow-delta));
                delta+=tmp; cap[i]-=tmp; cap[i^1]+=tmp;
            }
        }
        return delta;
    }
    int s[maxn],t[maxn],w[maxn],c[maxn];
    int main()
    {
        int N,M,K,W,C,i,j;
        scanf("%d",&C);
        while(C--){
            scanf("%d%d%d%d",&N,&M,&K,&W);
            cnt=1;  ans=0; T=M+M+2;
            for(int i=0;i<=T;i++)  vis[i]=Laxt[i]=0;
            for(int i=1;i<=M;i++) scanf("%d%d%d%d",&s[i],&t[i],&w[i],&c[i]);
            for(int i=1;i<=M;i++)
             for(int j=1;j<=M;j++)
              if(i!=j&&t[i]<=s[j]) add(i+M,j,1,c[i]==c[j]?-W:0);
            add(S,T-1,K,0); //限制N人
            for(int i=1;i<=M;i++) add(T-1,i,1,0); //收益
            for(int i=1;i<=M;i++) add(i,i+M,1,w[i]);
            for(int i=1;i<=M;i++) add(i+M,T,1,0);
            while(spfa()){
               vis[T]=1;
               while(vis[T]){
                  for(i=0;i<=T;i++) vis[i]=0;
                  ans-=dis[S]*dfs(S,N);
               }
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    C++ FFLIB之FFXML: 极简化TinyXml 读取
    使用ffpython嵌入和扩展python
    Json 备忘录
    一位软件工程师的6年工作总结
    Sql Server 备忘录
    走出软件作坊
    asp.net 使用Jquery 调用WebService返回JSON 类型数据
    .NET 页面间传值的几种方法
    CKeditor安全使用
    新浪短信Web Service
  • 原文地址:https://www.cnblogs.com/hua-dong/p/9892770.html
Copyright © 2020-2023  润新知