P1345 [USACO5.4]奶牛的电信Telecowmunication

#include<iostream>
#include<cstring>
#include<cstdio>
#define N 1000005
#define inf 0x3f3f3f3f
using namespace std;

struct node{
    int to,nxt,cap;
};

int que[N];
int h,qt;

struct Dinic{
    int n,m;
    int s,t;
    int tot;
    int d[N];
    int cur[N];
    node e[N];
    int vis[N];
    int head[N];
    Dinic(){tot=1;}
    void add(int f,int t,int c){
        e[++tot].to=t;
        e[tot].nxt=head[f];
        e[tot].cap=c;
        head[f]=tot;
        e[++tot].to=f;
        e[tot].nxt=head[t];
        e[tot].cap=0;
        head[t]=tot;
    }
    bool bfs(){
        memset(vis,false,sizeof(vis));
        for(int i=0;i<=n;++i)cur[i]=head[i];
        que[qt=1]=s,h=0;int top,to;d[s]=0;vis[s]=1;
        while(h<qt){
            top=que[++h];
            for(int i=head[top];i;i=e[i].nxt)
                if(!vis[e[i].to]&&e[i].cap){
                    to=e[i].to;que[++qt]=to;
                    vis[to]=true;d[to]=d[top]+1;
                    if(to==t)return true;
                }
        }
        return vis[t];
    }
    int dfs(int x,int fl){
        if(x==t)return fl;
        int flow=0,f;
        for(int i=cur[x];i;i=e[i].nxt)
            if(d[e[i].to]==d[x]+1)
                if(f=dfs(e[i].to,min(fl,e[i].cap))){
                    e[i].cap-=f;
                    e[i^1].cap+=f;
                    flow+=f;fl-=f;
                    if(fl<=0)break;
                }
        if(fl)d[x]=-1;
        return flow;
    }
    int dinic(int s,int t){
        this->s=s;
        this->t=t;
        int ans=0;
        while(bfs())
            ans+=dfs(s,inf);
        return ans;
    }
};

int n,m,s,t;

int main(){
    Dinic f;
    cin>>n>>m>>s>>t;f.n=3*n;
    for(int i=1;i<=m;i++){
        int a,b;
        cin>>a>>b;
        f.add(a+n,b,inf);f.add(b,a+n,0);
        f.add(b+n,a,inf);f.add(a,b+n,0);
    }
    for(int i=1;i<=n;i++)
        f.add(i,i+n,1),f.add(i+n,i,0);
    cout<<f.dinic(s+n,t)<<endl;
    return 0;
}
时间: 2024-10-10 21:33:40

P1345 [USACO5.4]奶牛的电信Telecowmunication的相关文章

洛谷 P1345 [USACO5.4]奶牛的电信Telecowmunication

P1345 [USACO5.4]奶牛的电信Telecowmunication 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相连,a2与a3相连,等等,那么电脑a1和a(c)就可以互发电邮. 很不幸,有时候奶牛会不小心踩到电脑上,农夫约翰的车也可能碾过电脑,这台倒霉的电脑就会坏掉.这意味着这台电脑不能再发送电邮了,于是与这台电脑相关的连接也就不可

AC日记——[USACO5.4]奶牛的电信Telecowmunication 洛谷 P1345

[USACO5.4]奶牛的电信Telecowmunication 思路: 水题: 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 205 #define maxm 20005 #define INF 0x3f3f3f3f int head[maxn],cnt=1,n,m,E[m

洛谷 1345 [USACO5.4]奶牛的电信Telecowmunication

题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相连,a2与a3相连,等等,那么电脑a1和a(c)就可以互发电邮. 很不幸,有时候奶牛会不小心踩到电脑上,农夫约翰的车也可能碾过电脑,这台倒霉的电脑就会坏掉.这意味着这台电脑不能再发送电邮了,于是与这台电脑相关的连接也就不可用了. 有两头奶牛就想:如果我们两个不能互发电邮,至少需要坏掉多少台电脑呢?请

[USACO5.4]奶牛的电信Telecowmunication

题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相连,a2与a3相连,等等,那么电脑a1和a(c)就可以互发电邮. 很不幸,有时候奶牛会不小心踩到电脑上,农夫约翰的车也可能碾过电脑,这台倒霉的电脑就会坏掉.这意味着这台电脑不能再发送电邮了,于是与这台电脑相关的连接也就不可用了. 有两头奶牛就想:如果我们两个不能互发电邮,至少需要坏掉多少台电脑呢?请

P1345 [USACO5.4]奶牛的电信[拆点+最小割]

题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相连,a2与a3相连,等等,那么电脑a1和a(c)就可以互发电邮. 很不幸,有时候奶牛会不小心踩到电脑上,农夫约翰的车也可能碾过电脑,这台倒霉的电脑就会坏掉.这意味着这台电脑不能再发送电邮了,于是与这台电脑相关的连接也就不可用了. 有两头奶牛就想:如果我们两个不能互发电邮,至少需要坏掉多少台电脑呢?请

p1345 奶牛的电信Telecowmunication

传送门 题目 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相连,a2与a3相连,等等,那么电脑a1和a(c)就可以互发电邮. 很不幸,有时候奶牛会不小心踩到电脑上,农夫约翰的车也可能碾过电脑,这台倒霉的电脑就会坏掉.这意味着这台电脑不能再发送电邮了,于是与这台电脑相关的连接也就不可用了. 有两头奶牛就想:如果我们两个不能互发电邮,至少需要坏掉多少台电脑呢

洛谷 P2742 [USACO5.1]圈奶牛Fencing the Cows

题目描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草的所有地点.对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度. 输入输出格式 输入格式: 输入数据的第一行包括一个整数 N.N(0 <= N <= 10,000)表示农夫约翰想要围住的放牧点的数目.接下来 N 行,每行由两个实数组成,Xi 和 Yi,对应平面上的放牧点坐标(-1,000,000 <= Xi,Yi <= 1,000,000).数字用小数表示. 输出格式

P2742 [USACO5.1]圈奶牛Fencing the Cows

题目描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草的所有地点.对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度. 输入输出格式 输入格式: 输入数据的第一行包括一个整数 N.N(0 <= N <= 10,000)表示农夫约翰想要围住的放牧点的数目.接下来 N 行,每行由两个实数组成,Xi 和 Yi,对应平面上的放牧点坐标(-1,000,000 <= Xi,Yi <= 1,000,000).数字用小数表示. 输出格式

P2742 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows

题意:n个点,求凸包周长.(纯板子QAQ) 定义 凸包:用最小的凸多边形将n个点围在里面的图形为凸包 前置 向量:点积:(a,b) (c,d)=(a*c,b*d) =|(a,b)|*|(c,d)|*cos<(a,b),(c,d)>; 叉积:(a,b) (c,d)=a*d-b*c=|(a,b)|*|(c,d)|*sin<(a,b),(c,d)>;  几何意义:以(a,b)(c,d)两向量作平行四边形,它俩的叉积为其面积 故有三角形面积=$\large{\frac{1}{2}*|(a,