码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 5294 Tricks Device

时间:2015-07-22 13:13:50      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:   网络流   spfa   最短路   

求边最少最短路
求最短路构成的边权为1的图的最大流

两个 模板

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <set>
#include <map>
#include <queue>
#include <vector>
#include <string>
#include <algorithm>
#include <utility>
using namespace std;

#define maxn 2100
#define INF 0x7f7f7f7f
struct Edge {
    int from,to,cap,flow;
};
int eid;
int nod[maxn];
vector<pair<int,int >>ee[maxn];
bool in[maxn];
int dis[maxn];
int cnt[maxn];
queue<int>q;

struct  Dinic {
    int n,m,s,t;
    vector<Edge>edges;
    vector<int>G[maxn];
    bool vis[maxn];
    int d[maxn];
    int cur[maxn];

    void addEdge(int from,int to,int cap) {
    edges.push_back((Edge) {from,to,cap,0});
    edges.push_back((Edge) {to,from,0,0});
    m=edges.size();
    G[from].push_back(m-2);
    G[to].push_back(m-1);
    }

    void init(){
      edges.clear();
      for(int i=1;i<=maxn;i++) G[i].clear();
    }
    bool Bfs() {
        memset(vis,0,sizeof(vis));
        queue<int>Q;
        while(!Q.empty()) Q.pop();
        Q.push(s);
        d[s]=0;
        vis[s] = 1;
        while(!Q.empty()) {
            int x = Q.front();
            Q.pop();
            for(int i=0; i<G[x].size(); i++) {
                Edge& e = edges[G[x][i]];
                if(!vis[e.to]&&e.cap>e.flow) {
                    vis[e.to] = 1;
                    d[e.to] = d[x]+1;
                    Q.push(e.to);
                }
            }
        }
        return vis[t];
    }

    int dfs(int x,int a) {
        if(x==t||a==0) return a;
        int flow = 0,f;
        for(int &i=cur[x]; i<G[x].size(); i++) {
            Edge& e  = edges[G[x][i]];
            if(d[x]+1==d[e.to]&&(f=dfs(e.to,min(a,e.cap-e.flow)))>0) {
                e.flow += f;
                edges[G[x][i]^1].flow -= f;
                flow += f;
                a -= f;
                if(a==0) break;
            }
        }
        return flow;
    }

    int maxflow(int s,int t) {

        this->s=s;
        this->t=t;
        int flow  = 0;
        while(Bfs()) {
            memset(cur,0,sizeof(cur));
            flow+=dfs(s,INF);
        }
        return flow;
    }
};

void spfa(int src,int tc)
{
    memset(in,false,sizeof(in));
    while(!q.empty())q.pop();
    for(int i=0;i<maxn;++i)
    {
        dis[i]=INF;
        cnt[i]=INF;
    }
    q.push(src);
    in[src]=true;
    dis[src]=0;
    cnt[src]=0;
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        in[u]=false;
        for(int i=0;i<(int)ee[u].size();++i)
        {
            int v=ee[u][i].first;
            if(dis[v]==dis[u]+ee[u][i].second)cnt[v]=min(cnt[v],cnt[u]+1);
            if(dis[v]>dis[u]+ee[u][i].second)
            {

                dis[v]=dis[u]+ee[u][i].second;
                cnt[v]=cnt[u]+1;
                if(!in[v])
                {
                    q.push(v);
                    in[v]=true;
                }
            }
        }
    }
    return;
}

int n,k;
Dinic slove;
void build_graph()
{
    eid=0;
    memset(nod,-1,sizeof(nod));
    for(int i=1;i<=n;++i)
    {
        for(int j=0;j<(int)ee[i].size();++j)
        {
            int v=ee[i][j].first;
            if(dis[i]+ee[i][j].second==dis[v])
            {
                slove.addEdge(i,v,1);
            }
        }
    }
    return;
}

int main(){
        while(scanf("%d%d",&n,&k)==2){
        slove.init();
        for(int i=0;i<maxn;++i)ee[i].clear();
        for(int i=0;i<k;i++)
        {
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            ee[x].push_back(make_pair(y,z));
            ee[y].push_back(make_pair(x,z));
            //addEdge(x,y,1);
        }
        spfa(1,n);
        build_graph();
        printf("%d %d\n",slove.maxflow(1,n),k-cnt[n]);
    }

}

版权声明:都是兄弟,请随意转载,请注明兄弟是谁

hdu 5294 Tricks Device

标签:   网络流   spfa   最短路   

原文地址:http://blog.csdn.net/u013076044/article/details/47000303

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!