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>

鎶€鏈浘鐗? id=
#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;
}
View Code

 

以上是关于P4300 [AHOI2008]涓婂璺嚎的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ1831: [AHOI2008]逆序对

[bzoj1787][Ahoi2008]Meet 紧急集合(lca)

bzoj1786: [Ahoi2008]Pair 配对&&1831: [AHOI2008]逆序对

B1786 [Ahoi2008]Pair 配对 逆序对+dp

[Ahoi2008]Meet 紧急集合

bzoj1831AHOI2008逆序对

(c)2006-2024 SYSTEM All Rights Reserved IT常识