HDU 5294 Tricks Device(最短路最小割)

来源:互联网 发布:python量化交易教程pdf 编辑:程序博客网 时间:2024/05/07 06:12
////  main.cpp//  Richard////  Created by 邵金杰 on 16/9/20.//  Copyright © 2016年 邵金杰. All rights reserved.//#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<queue>using namespace std;const int maxn=3000+10;int vis[maxn],dist[maxn],minb[maxn],head[maxn],Layer[maxn];int n,m;int tot;struct edge{    int v,w,next;}edge[maxn*60];struct node{    int v,flow,rev;    node(int v,int flow,int rev):v(v),flow(flow),rev(rev) {}};vector<node> G[maxn];void add_edge(int u,int v,int w){    edge[tot].v=v;    edge[tot].w=w;    edge[tot].next=head[u];    head[u]=tot++;    edge[tot].v=u;    edge[tot].w=w;    edge[tot].next=head[v];    head[v]=tot++;}void spfa(int s){    memset(dist,0x7f,sizeof(dist));    memset(minb,0x7f,sizeof(minb));    memset(vis,0,sizeof(vis));    queue<int> q;    dist[s]=0;    minb[s]=0;    vis[s]=1;    q.push(s);    while(!q.empty())    {        int u=q.front();q.pop();        vis[u]=0;        for(int i=head[u];i!=-1;i=edge[i].next)        {            int v=edge[i].v;            int w=edge[i].w;            if(dist[v]==dist[u]+w){                minb[v]=min(minb[v],minb[u]+1);                if(!vis[v]){                    vis[v]=1;                    q.push(v);                }            }            if(dist[v]>dist[u]+w){                dist[v]=dist[u]+w;                minb[v]=minb[u]+1;                if(!vis[v]){                    vis[v]=1;                    q.push(v);                }            }        }    }}int abs(int x){return x>0?x:-x;}void add(int u,int v,int flow){    G[u].push_back(node(v,flow,(int)G[v].size()));    G[v].push_back(node(u,0,(int)G[u].size()-1));}void Build_Graph(){    for(int i=1;i<=n;i++)    {        for(int j=head[i];j!=-1;j=edge[j].next)        {            int v=edge[j].v,w=edge[j].w;            if(dist[v]-dist[i]==w){                add(i,v,1);            }        }    }}int dfs(int v,int t,int f){    if(v==t) return f;    vis[v]=1;    for(int i=0;i<G[v].size();i++)    {        node &e=G[v][i];        if(!vis[e.v]&&e.flow>0){            int d=dfs(e.v,t,min(f,e.flow));            if(d>0){                e.flow-=d;                G[e.v][e.rev].flow+=d;                return d;            }        }    }    return 0;}int Dinic(){    int ans=0;    while(1)    {        memset(vis,0,sizeof(vis));        int f=dfs(1,n,99999999);        if(f==0) break;        else ans+=f;    }    return ans;}int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        tot=0;        memset(head,-1,sizeof(head));        for(int i=0;i<=n;i++) G[i].clear();        int u,v,w;        for(int i=0;i<m;i++){            scanf("%d%d%d",&u,&v,&w);            add_edge(u,v,w);        }        spfa(1);        Build_Graph();        printf("%d %d\n",Dinic(),m-minb[n]);    }    return 0;}

0 0