POJ 3801/HDU 3157 Crazy Circuits | 有下界的最小流

题目:

POJ最近总是炸

所以还是用HDU吧http://acm.hdu.edu.cn/showproblem.php?pid=3157



题解:

题很长,但其实就是给个有源汇带下界网络流(+是源,-是汇),求最小流

求法:

1.模仿可行流建图,但是不加t到s的INF边

2.跑最大流

3.加t到sINF边

4.跑最大流

5.如果两次答案相加不等于sum,无解;

6.如果有解,t到s的反边流量就是答案

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define N 205
#define M 20005
#define INF 0x3f3f3f3f
using namespace std;
int n,m,s,t,S,T,c,cur[N],head[N],d[N],sum,ecnt=1,ans,lev[N];
char a[N],b[N];
queue<int> q;
struct adj
{
    int nxt,v,w;
}e[M];
int calc(char j[])
{
    if (j[0]==‘+‘) return n+1;
    if (j[0]==‘-‘) return n+2;
    int ans=0,s=strlen(j);
    for (int i=0;i<s;i++) ans*=10,ans+=j[i]-‘0‘;
    return ans;
}
void add(int u,int v,int w)
{
    e[++ecnt].v=v;e[ecnt].w=w;e[ecnt].nxt=head[u];head[u]=ecnt;
    e[++ecnt].v=u;e[ecnt].w=0;e[ecnt].nxt=head[v];head[v]=ecnt;
}
void init()
{
    memset(head,0,sizeof(head));
    memset(d,0,sizeof(d));
    ecnt=1;ans=sum=0;
}
bool bfs()
{
    for (int i=1;i<=T;i++)
        cur[i]=head[i],lev[i]=-1;
    q.push(S);lev[S]=1;
    while (!q.empty())
    {
        int u=q.front();q.pop();
        for (int i=head[u],v;i;i=e[i].nxt)
            if (lev[v=e[i].v]==-1 && e[i].w>0)
                q.push(v),lev[v]=lev[u]+1;
    }
    return lev[T]!=-1;
}
int dfs(int u,int flow)
{
    if (u==T) return flow;
    int ret=0,v,delta;
    for (int &i=cur[u];i;i=e[i].nxt)
        if (lev[v=e[i].v]==lev[u]+1 && e[i].w>0)
        {
            delta=dfs(v,min(flow-ret,e[i].w));
            if (delta)
            {
                e[i].w-=delta;e[i^1].w+=delta;ret+=delta;
                if (ret==flow) break;
            }
        }
    return ret;
}
int main()
{
    while (scanf("%d%d",&n,&m)!=EOF)
    {
    if (n==0 && m==0) break;
    init();
    s=n+1;t=s+1;S=t+1;T=S+1;
    for (int i=1,u,v;i<=m;i++)
    {
        scanf("%s%s%d",a,b,&c);
        u=calc(a);v=calc(b);
        add(u,v,INF-c);
        d[u]-=c;d[v]+=c;
    }
    for (int i=1;i<=n+2;i++)
        if (d[i]>0) add(S,i,d[i]),sum+=d[i];
        else if (d[i]<0) add(i,T,-d[i]);
    while (bfs()) ans+=dfs(S,INF);
    add(t,s,INF);
    while (bfs()) ans+=dfs(S,INF);
    if (ans!=sum) puts("impossible");
    else printf("%d\n",e[ecnt].w);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/mrsheep/p/8227964.html

时间: 2024-07-29 20:18:26

POJ 3801/HDU 3157 Crazy Circuits | 有下界的最小流的相关文章

HDU 3157 Crazy Circuits(有源汇上下界最小流)

HDU 3157 Crazy Circuits 题目链接 题意:一个电路板,上面有N个接线柱(标号1~N),还有两个电源接线柱 + -,给出一些线路,每个线路有一个下限值求一个可以让所有部件正常工作的总电流 没有则输出impossible 思路: 有源汇有上下界求最小流,建模方法为: 按无源汇先建图,跑超级源汇ss->tt一次,然后加入t->s,容量INF的边,在跑一次ss->tt,如果是满流,就有解,解为t->s边的当前流量 顺带写个最大流的,最大流就先把t->s加入直接跑

[hdu] 3157 Crazy Circuits || 有源汇上下界最小流

原题 有两个正负极n个节点和m个元件,每个元件告诉端点是接在哪个节点上的,并且每个元件有工作的最小电流限制,问使所有元件工作的满足条件的最小电流是多少. 有源汇上下界最小流. 考虑dinic的推流思想,所以在跑完可行流后,减去t到s的最大流就是最小流. 实现方法: 建图时先不加入t到s的inf边,跑最大流,再加入inf边跑最大流.若此刻是可行流,那么加入的t到s的inf边的反向边的权值就是最小流. ll ans=0; ans+=dinic(); add(t,s,inf); ans+=dinic(

hdu 3157 Crazy Circuits 网络流

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3157 You’ve just built a circuit board for your new robot, and now you need to power it. Your robot circuit consists of a number of electrical components that each require a certain amount of current to

hdoj 3157 Crazy Circuits 【有下界最小流】

题目:hdoj 3157 Crazy Circuits 题意:现在要制造一个电路板,电路板上有 n 个电子元件,各个元件之间有单向的电流流向,然后有一个 + ,电流进入, -- 电流汇入,然后判断能不能让电路板工作,如果能的话求最小电流. 分析:有上下界网络流,求最小流 首先是判断能不能够让电路板工作,能工作的条件就是流量平衡,判断方法前面题目中讲过. 同样先转换为无源汇网络流问题,添加t→ s边权为无穷.那么最小流不就是在满足所有下界的情况的流么.即上面提到的,求得SS→ TT的最大流之后,其

UVA1440 有下界的最小流

题意很简单: 给出一张有向图,每次你可以从图中的任意一点出发,经过若干条边后停止,然后问你最少走几次可以将图中的每条边都走过至少一次,并且要输出方案 这个转化为网络流的话,就相当于 求一个最小流,并且存在下界,即每条边至少走一次 这让我联想到很久之前的一道题,也是有向图,问走多少条路径可以将整个图中的每条边都走过,但是跟本题不同的是,那题是不允许重复走边的. 那道题目的解是这样的: 对于图中的每个点i,设D[i]为(i的入度-i的出度)的值,按照D[i]将图中的点分类:D[i]<0的称为"

【BZOJ-2502】清理雪道 有上下界的网络流(有下界的最小流)

2502: 清理雪道 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 594  Solved: 318[Submit][Status][Discuss] Description 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时清理雪道.你们拥有一架直升飞机,每次飞行可以从总部带一个人降落到滑雪场的某个地点,然后再飞回总部.从降落的地点出

[BZOJ2502]清理雪道解题报告|带下界的最小流

滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时清理雪道.你们拥有一架直升飞机,每次飞行可以从总部带一个人降落到滑雪场的某个地点,然后再飞回总部.从降落的地点出发,这个人可以顺着斜坡向下滑行,并清理他所经过的雪道. 由于每次飞行的耗费是固定的,为了最小化耗费,你想知道如何用最少的飞行次数才能完成清理雪道的任务. 题意就是给定一张DAG,求每条边起码经过一次求覆盖所有边的最小路径条数

HDOJ 3157 Crazy Circuits

给一些电路上的两个点和这两个点之间最少要通过的电流,要求正极到负极间的流量再满足条件的情况下最少 有源汇点上下界最小流: 建图: 设原源汇点 s,t 建立超级源汇点S,T先不连接 t-->s 像无源汇点可行流判断一样的建图,对S,T跑一遍最大流,记录流量f1... 连接源汇点 t--->s 无下界,上界INF ....再对S,T跑一遍最大流,得到流量f2... 如果  则存在最小流,最小流流量既 t--->s 的后悔边的流量. 否则无解 Crazy Circuits Time Limit

poj 2396 Budget 边容量有上下界的最大流

题意: 给一个矩阵的每行和及每列和,在给一些行列或点的限制条件.求一个满足的矩阵. 分析: 转化为有上下界的网络流,注意等于也是一种上下界关系,然后用dinic算法. 代码: //poj 2396 //sep9 #include <iostream> #include <queue> #include <algorithm> using namespace std; const int maxN=210; const int maxM=40; const int max