HDU529最小割和单源最短路

来源:互联网 发布:商品期货交易软件下载 编辑:程序博客网 时间:2024/04/29 03:49

没搞过图论,看了一天的标程也没完全搞明白,懂那么一点,抄袭了一遍标程,

交上去结果CE,呵呵,然后交了一发标程还是CE,呵呵,

回头有空再演究下,贴一发CE的代码:

#include <iostream>#include <stdio.h>#include <math.h>#include <string.h>#include <set>#include <map>#include <queue>#include <vector>#include <string>#include <algorithm>using namespace std;#define max(a,b)((a)>(b)?(a):(b))#define min(a,b)((a)<(b)?(a):(b))#define N 2005#define M 500005#define INF 1000000007#define EPS 1e-8struct edge{int u;int v;int w;int next;}e[M];vector<pair<int,int > >ee[N];int eid;int nod[N];int tnod[N];int level[N];queue<int>q;bool in[N];int dis[N];int cnt[N];int n,m;int max_flow;int add_flow;void add_edge(int x,int y,int z){e[eid].u=x;e[eid].v=y;e[eid].w=z;e[eid].next=nod[x];nod[x]=eid++;}bool bfs(int src,int tc){int u,v,i;memset(level,-1,sizeof(level));memset(in,false,sizeof(in));while(!q.empty())q.pop();q.push(src);in[src]=true;level[src]=0;while(!q.empty()){u=q.front();q.pop();in[u]=false;i=nod[u];while(i!=-1){v=e[i].v;if(e[i].w>0&&level[v]==-1){level[v]=level[u]+1;q.push(v);in[v]=true;if(v==tc)return true;}i=e[i].next;}}return false;}void find(int src,int tc){vector<int>road;int temp_flow;int u,i,k;road.clear();add_flow=0;u=src;while(tnod[src]!=-1){i=tnod[u];if(u!=tc&&i!=-1&&e[i].w>0&&level[u]+1==level[e[i].v]){road.push_back(i);u=e[i].v;}else if(u==tc){temp_flow=INF;for(i=0;i<(int)road.size();++i){k=road[i];temp_flow=min(temp_flow,e[k].w);}for(i=(int)road.size()-1;i>=0;--i){k=road[i];e[k].w-=temp_flow;e[k^1].w+=temp_flow;if(e[k].w==0){while((int)road.size()>i)road.pop_back();u=e[k].u;}}add_flow+=temp_flow;}else{while((int)road.size()>0&&u!=src&&tnod[u]==-1){road.pop_back();u=e[road[road.size()]].u;}tnod[u]=e[tnod[u]].next;}}return;}void Dinic(int src,int tc){max_flow=0;while(bfs(src,tc)){for(int i=0;i<=n;++i)tnod[i]=nod[i];find(src,tc);max_flow+=add_flow;}return;}void spfa(int src,int tc){memset(in,false,sizeof(in));while(!q.empty())q.pop();for(int i=0;i<N;++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;}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]){add_edge(i,v,1);add_edge(v,i,0);}}}return;}int main(){//freopen("2.in","r",stdin);//freopen("2.out","w",stdout);int u,v,l;while(scanf("%d%d",&n,&m)!=EOF){for(int i=0;i<N;++i)ee[i].clear();for(int i=0;i<m;++i){scanf("%d%d%d",&u,&v,&l);ee[u].push_back(make_pair<int,int>(v,l));ee[v].push_back(make_pair<int,int>(u,l));}spfa(1,n);build_graph();Dinic(1,n);printf("%d %d\n",max_flow,m-cnt[n]);}return 0;}


0 0