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;
}
原文地址:https://www.cnblogs.com/bitch1319453/p/4751014.html