P4300 [AHOI2008]涓婂璺嚎
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P4300 [AHOI2008]涓婂璺嚎相关的知识,希望对你有一定的参考价值。
鏍囩锛?a href='http://www.mamicode.com/so/1/closed' title='closed'>closed max += dff oid 鎴戜笉鐭ラ亾 struct memset
棰樿В锛?/strong>
鐪嬪埌杈撳嚭鐨勭涓€琛岋紝鏄剧劧灏辨槸鏈€鐭矾锛宯<=500闅忎究涔辨悶閮藉彲浠ャ€傝€屾垜浠湅浠栬浣垮垹杈硅繃鍚庣殑浠d环鏈€灏忋€傞偅涔堣€冭檻鎬庢牱鍒犺竟锛屽氨鏄垹鍘?-n鐨勬渶鐭矾涓婄殑杈广€備竴寮€濮嬫垜涓嶇煡閬撳垹杈规€庝箞澶勭悊锛岀湅浜嗛瑙f墠鐭ラ亾锛岃繖鏄敤鐨勬槸鏈€鍩虹鐨勭綉缁滄祦銆傛垜浠厛鏋氫妇鎵€鏈夌偣锛岀劧鍚庡彲浠ユ妸鍦ㄦ瘡涓€涓湪鏈€鐭矾涓婄殑鐐瑰缓涓€涓柊鍥撅紝鐒跺悗杩欎釜鏂板浘鐨勬渶澶ф祦锛堟渶灏忓壊锛夊嵆涓虹瓟妗堛€傜敤dinic绠楁硶鍗冲彲銆?/strong>
浠g爜锛?/strong>
#include<bits/stdc++.h> using namespace std; const int maxn=1100007; const int inf=0x7fffffff; struct node{ int nxt,to,val,cut; }edge[maxn*3]; int head[maxn],cnt; int cur[maxn]; struct node2{ int nxt,to,val; }edge2[maxn*3]; void add(int x,int y,int v,int w){ edge[++cnt].nxt=head[x]; edge[cnt].to=y; edge[cnt].val=v; edge[cnt].cut=w; head[x]=cnt; } int head2[maxn],tot=1;//鏀规垚1灏辫浜嗭紵锛? void newadd(int x,int y,int v){ edge2[++tot].nxt=head2[x]; edge2[tot].to=y; edge2[tot].val=v; head2[x]=tot; } priority_queue<pair<int,int> >que; bool vis[maxn]; int dis[maxn]; int n,m; int ans1; int p[maxn],q[maxn],t[maxn],c[maxn]; void dijkstra(int x){ memset(vis,false,sizeof(vis)); memset(dis,0x3f,sizeof(dis)); que.push(make_pair(0,x)); dis[x]=0; while(!que.empty()){ int u=que.top().second; que.pop(); if(vis[u]) continue; vis[u]=true; for(int i=head[u];i;i=edge[i].nxt){ int go=edge[i].to; if(dis[go]>dis[u]+edge[i].val){ dis[go]=dis[u]+edge[i].val; que.push(make_pair(-dis[go],go)); } } } } int dep[maxn]; queue<int> qq; int bfs(){ qq.push(1); memset(dep,0,sizeof(dep)); dep[1]=1; while(!qq.empty()){ int u=qq.front(); qq.pop(); for(int i=head2[u];i;i=edge2[i].nxt){ int v=edge2[i].to; if(edge2[i].val&&!dep[v]){ dep[v]=dep[u]+1; qq.push(v); } } } return dep[n]; } int dfs(int now,int flow){ if(now==n) return flow; for(int i=head2[now];i;i=edge2[i].nxt){ int go=edge2[i].to; if(dep[go]==dep[now]+1&&edge2[i].val){ int temp=dfs(go,min(flow,edge2[i].val)); if(temp){ edge2[i].val-=temp; edge2[i^1].val+=temp; return temp; } } } return 0; } int dinic(){ int ans=0,tmp; while(bfs()){ while(tmp=dfs(1,inf)) ans+=tmp; } return ans; } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ scanf("%d%d%d%d",&p[i],&q[i],&t[i],&c[i]); add(p[i],q[i],t[i],c[i]);add(q[i],p[i],t[i],c[i]); } dijkstra(1); ans1=dis[n]; for(int i=1;i<=n;i++){ for(int j=head[i];j;j=edge[j].nxt){ int go=edge[j].to; if(dis[go]==dis[i]+edge[j].val){ newadd(i,go,edge[j].cut); newadd(go,i,0); } } } printf("%d %d ",ans1,dinic()); return 0; }
以上是关于P4300 [AHOI2008]涓婂璺嚎的主要内容,如果未能解决你的问题,请参考以下文章
[bzoj1787][Ahoi2008]Meet 紧急集合(lca)
bzoj1786: [Ahoi2008]Pair 配对&&1831: [AHOI2008]逆序对