zoukankan      html  css  js  c++  java
  • hdu 5294 Tricks Device

    中规中矩的做法,第二发SAP。贴一发留恋。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<vector>
    using namespace std;
    const int INF=0x3f3f3f3f;
    const int maxn=2008;
    struct fuck{
        int v,w;
        bool operator<(const fuck &a)    const
        {
            return w>a.w;
        }
    };
    struct shit{
        int u,v,cap,flow,next;
    }edge[maxn<<6];
    vector<fuck>    g[maxn];
    vector<int>    distree[maxn];
    int dis[maxn],bitch[maxn],head[maxn];
    bool vis[maxn];
    int tol=0,len;
    void init()
    {
        tol=0;
        len=1;
        memset(head,-1,sizeof(head));
    }
    void addedge(int u,int v,int w)
    {
        edge[tol].u=u;
        edge[tol].v=v;
        edge[tol].cap=w;
        edge[tol].flow=0;
        edge[tol].next=head[u];
        head[u]=tol++;
        edge[tol].u=v;
        edge[tol].v=u;
        edge[tol].cap=0;
        edge[tol].flow=0;
        edge[tol].next=head[v];
        head[v]=tol++;
    }
    void dfs(int u)
    {
        int v;
        for(int i=0;i<distree[u].size();i++)
        {
            v=distree[u][i];
            addedge(u,v,1);
            if(vis[v])    continue;
            vis[v]=true;
            len++;
            dfs(v);
        }
    }
    void dij(int n)
    {
        priority_queue<fuck>    q;
        int u,v,i,w;
        fuck pp;
        memset(dis,INF,sizeof(dis));
        memset(vis,false,sizeof(vis));
        pp.v=1;pp.w=0;bitch[1]=0;dis[1]=0;
        q.push(pp);
        while(!q.empty())
        {
            pp=q.top();q.pop();
            u=pp.v;
            if(vis[u])    continue;
            vis[u]=true;
            for(i=0;i<g[u].size();i++)
            {
                v=g[u][i].v;w=g[u][i].w;
                if(dis[v]>=dis[u]+w)
                {
                    if(dis[v]==dis[u]+w)
                    {
                        if(bitch[v]>bitch[u]+1)
                        bitch[v]=bitch[u]+1;
                        distree[v].push_back(u);
                    }
                    else
                    {
                        dis[v]=dis[u]+w;
                        bitch[v]=bitch[u]+1;
                        pp.w=dis[v];pp.v=v;
                        q.push(pp);
                        distree[v].clear();
                        distree[v].push_back(u);
                    }
                }
            }
        }
    }
    int dep[maxn],gap[maxn];
    void bfs(int start,int last)
    {
        memset(dep,-1,sizeof(dep));
        memset(gap,0,sizeof(gap));
        queue<int>    q;
        q.push(last);dep[last]=0;gap[0]=1;
        int i,u,v;
        while(!q.empty())
        {
            u=q.front();q.pop();
            for(i=head[u];i!=-1;i=edge[i].next)
            {
                v=edge[i].v;
                if(edge[i].cap!=edge[i].flow||dep[v]!=-1)    continue;
                q.push(v);
                dep[v]=dep[u]+1;
                ++gap[dep[v]];
            }
        }
    }
    int sap(int start,int last)
    {
        int max_flow=0,i,u,v,w;
        bfs(start,last);
        int cur[maxn];
        int S[maxn];
        int top=0;
        for(i=last;i<=start;i++)
            cur[i]=head[i];
        u=start;
        while(dep[start]<=len)
        {
            if(u==last)
            {
                int temp=INF;
                int inser;
                for(i=0;i<top;i++)
                    if(temp>edge[S[i]].cap-edge[S[i]].flow)
                    {
                        temp=edge[S[i]].cap-edge[S[i]].flow;
                        inser=i;
                    }
                for(i=0;i<top;i++)
                {
                    edge[S[i]].flow+=temp;
                    edge[S[i]^1].flow-=temp;
                }
                max_flow+=temp;
                top=inser;
                u=edge[S[top]].u;
            }
            if(u!=last&&gap[dep[u]-1]==0)    break;
            for(i=cur[u];i!=-1;i=edge[i].next)
                if(edge[i].cap>edge[i].flow&&dep[u]==dep[edge[i].v]+1)
                    break;
            if(i!=-1)
            {
                cur[u]=i;
                S[top++]=i;
                u=edge[i].v;
            }
            else
            {
                int mi=len+1;
                for(i=head[u];i!=-1;i=edge[i].next)
                {
                    if(edge[i].cap==edge[i].flow)    continue;
                    if(mi>dep[edge[i].v])
                    {
                        mi=dep[edge[i].v];
                        cur[u]=i;
                    }
                }
                --gap[dep[u]];
                dep[u]=mi+1;
                ++gap[dep[u]];
                if(u!=start)    u=edge[S[--top]].u;
            }
        }
        return max_flow;
    }
    int main()
    {
        int i,j,n,m,u,v,w;
        fuck pp;
        //freopen("1007.in","r",stdin);
        //freopen("fuck.txt","w",stdout);
        while(scanf("%d%d",&n,&m)==2)
        {
            for(i=0;i<=n;i++)
            {
                g[i].clear();
                distree[i].clear();
            }
            init();
            for(i=0;i<m;i++)
            {
                scanf("%d%d%d",&u,&v,&w);
                pp.v=v;pp.w=w;
                g[u].push_back(pp);
                pp.v=u;
                g[v].push_back(pp);
            }
            dij(n);
            memset(vis,false,sizeof(vis));
            vis[n]=true;
            dfs(n);
            int y=sap(n,1);
            printf("%d %d
    ",y,m-bitch[n]);
        }
        return 0;
    }
  • 相关阅读:
    即时通讯之环信视频语音实时通话与单聊和群聊实现
    检测.net framework 版本
    Abp(.NetCore)开发与发布过程3-部署Ubuntu站点
    Abp(.NetCore)开发与发布过程2
    Abp(.NetCore)开发与发布过程
    Redis实战与 Session缓存
    Redis 安装与初体验
    [转]gluPerspective函数
    [转]gluLookAt 函数详解
    [转]unity3D游戏开发之GUI
  • 原文地址:https://www.cnblogs.com/bitch1319453/p/4751014.html
Copyright © 2011-2022 走看看