Uva(10594)

这题是最小费用最大流的问题,给出边的关系和花费,然后给吃D和K,D是要运输的数据流。K表示每条边能运输的最大流量,这图的应该构造无向图,而且自己发现,凡是要无向图的网络流问题最好还是用邻接表来表示这样就可以解决重边和反向边问题,之前用邻接矩阵来表示一直错= =

我们还要抽象出一个源点0,然后0-1的花费为0,容量是D,然后上模板就好了

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<queue>
#define inf 111111111111111111
using namespace std;
const int N=5550;
struct node3
{
    int u,v;
    long long w;
}E[N];
struct node4
{
    int v,u;
    int next;
    int f;
    int cap;
    long long cost;
}G[50000];
long long d[110];
int head[110];
int p[110];
bool vis[110];
int n,m;
int D,K;
int num;
void init()
{
    memset(head,-1,sizeof(head));
    num=0;
}
void add(int u,int v,int w,long long c)
{
    G[num].u=u;
    G[num].v=v;
    G[num].cap=w;
    G[num].cost=c;
    G[num].f=0;
    G[num].next=head[u];
    head[u]=num++;
    int tt=u;
    u=v;
    v=tt;
    G[num].u=u;
    G[num].v=v;
    G[num].cap=0;
    G[num].cost=-c;
    G[num].f=0;
    G[num].next=head[u];
    head[u]=num++;
}
void EK_()
{
    queue<int>q;
    int F=0;
    long long c=0;
    for(;;)
    {
        for(int i=0;i<=n;i++)
        d[i]=(i==0?0:inf);
        memset(p,-1,sizeof(p));
        memset(vis,false,sizeof(vis));
        q.push(0);
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            vis[u]=false;
            for(int k=head[u];k!=-1;k=G[k].next)
            {
            int v=G[k].v;
            if(G[k].cap>G[k].f&&d[v]>d[u]+G[k].cost)
            {
               d[v]=d[u]+G[k].cost;
               p[v]=k;
               if(!vis[v])
               {
                   vis[v]=true;
                   q.push(v);
               }
            }
        }
       }
        if(d[n]==inf)
        break;
        int  a=999999999;
        for(int u=p[n];u!=-1;u=p[G[u].u])
        {
            a=min(a,G[u].cap-G[u].f);
        }
        for(int k=p[n];k!=-1;k=p[G[k].u])
        {
           G[k].f+=a;
           G[k^1].f-=a;
        }
        F+=a;
        c+=a*d[n];
    }
    if(F==D)
    cout<<c<<endl;
    else
    cout<<"Impossible.\n";
}
int main()
{
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        init();
        for(int i=1;i<=m;i++)
        cin>>E[i].u>>E[i].v>>E[i].w;
        cin>>D>>K;
        add(0,1,D,0);
        for(int i=1;i<=m;i++)
        {
            add(E[i].u,E[i].v,K,E[i].w);
            add(E[i].v,E[i].u,K,E[i].w);
        }
        EK_();
    }
    return 0;
}
    
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<queue>
#define inf 111111111111111111
using namespace std;
const int N=5550;
struct node3
{
    int u,v;
    long long w;
}E[N];
struct node4
{
    int v,u;
    int next;
    int f;
    int cap;
    long long cost;
}G[50000];
long long d[110];
int head[110];
int p[110];
bool vis[110];
int n,m;
int D,K;
int num;
void init()
{
    memset(head,-1,sizeof(head));
    num=0;
}
void add(int u,int v,int w,long long c)
{
    G[num].u=u;
    G[num].v=v;
    G[num].cap=w;
    G[num].cost=c;
    G[num].f=0;
    G[num].next=head[u];
    head[u]=num++;
    int tt=u;
    u=v;
    v=tt;
    G[num].u=u;
    G[num].v=v;
    G[num].cap=0;
    G[num].cost=-c;
    G[num].f=0;
    G[num].next=head[u];
    head[u]=num++;
}
void EK_()
{
    queue<int>q;
    int F=0;
    long long c=0;
    for(;;)
    {
        for(int i=0;i<=n;i++)
        d[i]=(i==0?0:inf);
        memset(p,-1,sizeof(p));
        memset(vis,false,sizeof(vis));
        q.push(0);
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            vis[u]=false;
            for(int k=head[u];k!=-1;k=G[k].next)
            {
            int v=G[k].v;
            if(G[k].cap>G[k].f&&d[v]>d[u]+G[k].cost)
            {
               d[v]=d[u]+G[k].cost;
               p[v]=k;
               if(!vis[v])
               {
                   vis[v]=true;
                   q.push(v);
               }
            }
        }
       }
        if(d[n]==inf)
        break;
        int  a=999999999;
        for(int u=p[n];u!=-1;u=p[G[u].u])
        {
            a=min(a,G[u].cap-G[u].f);
        }
        for(int k=p[n];k!=-1;k=p[G[k].u])
        {
           G[k].f+=a;
           G[k^1].f-=a;
        }
        F+=a;
        c+=a*d[n];
    }
    if(F==D)
    cout<<c<<endl;
    else
    cout<<"Impossible.\n";
}
int main()
{
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        init();
        for(int i=1;i<=m;i++)
        cin>>E[i].u>>E[i].v>>E[i].w;
        cin>>D>>K;
        add(0,1,D,0);
        for(int i=1;i<=m;i++)
        {
            add(E[i].u,E[i].v,K,E[i].w);
            add(E[i].v,E[i].u,K,E[i].w);
        }
        EK_();
    }
    return 0;
}
    
时间: 2024-11-12 16:18:11

Uva(10594)的相关文章

UVA (POJ 1598)Excuses, Excuses!

Excuses, Excuses! Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Description  Excuses, Excuses!  Judge Ito is having a problem with people subpoenaed for jury duty giving rather lame excuses in order to avoid ser

最小瓶颈路 Uva 534 Frogger

说明:关于Uva的题目,可以在vjudge上做的,不用到Uva(那个极其慢的)网站去做. 最小瓶颈路:找u到v的一条路径满足最大边权值尽量小 先求最小生成树,然后u到v的路径在树上是唯一的,答案就是这条路径. Uva 534 Frogger Time Limit: 3000MS 64bit IO Format: %lld & %llu Description Freddy Frog is sitting on a stone in the middle of a lake. Suddenly h

【深度学习系列3】 Mariana CNN并行框架与图像识别

[深度学习系列3] Mariana CNN并行框架与图像识别 本文是腾讯深度学习系列文章的第三篇,聚焦于腾讯深度学习平台Mariana中深度卷积神经网络Deep CNNs的多GPU模型并行和数据并行框架. 将深度卷积神经网络(Convolutional Neural Networks, 简称CNNs)用于图像识别在研究领域吸引着越来越多目光.由于卷积神经网络结构非常适合模型并行的训练,因此以模型并行+数据并行的方式来加速Deep CNNs训练,可预期取得较大收获.Deep CNNs的单机多GPU

全局内存

p { margin-bottom: 0.1in; direction: ltr; color: #00000a; line-height: 120%; text-align: justify; orphans: 0; widows: 0 } p.western { font-family: "Calibri", serif; font-size: 10pt } p.cjk { font-family: "DejaVu Sans"; font-size: 10pt

HTTP1.1协议中文版-RFC2616

转自:http://www.cnpaf.net/Class/HTTP/200811/23277.html 说明 本文档规定了互联网社区的标准组协议,并需要讨论和建议以便更加完善.请参考 “互联网官方协议标准”(STD 1)来了解本协议的标准化状态.本协议不限流传发布. 版权声明 Copyright (C) The Internet Society (1999).   All Rights Reserved. 摘要 超文本传输协议(HTTP)是一种为分布式,合作式,超媒体信息系统.它是一种通用的,

uva 10594 Data Flow (最小费最大流+题目给的数据有错)

uva 10594 Data Flow 题目大意:给出一张图,以及D, K,D代表所要传送的数据量,K代表每条边可以传送的数据量(就是容量),问在可以传送所有数据的前提下,最小耗费时间. 解题思路:建一个超级源点连向源点1,容量为D,然后求该图的最小费最大流.最后将求出的最大流与D比较,比D小输出inpossible,否则输出最小费. #include <cstdio> #include <cstring> #include <algorithm> #include &

uva 10012 How Big Is It?(枚举)

uva 10012 How Big Is It? Ian's going to California, and he has to pack his things, including his collection of circles. Given a set of circles, your program must find the smallest rectangular box in which they fit. All circles must touch the bottom o

uva:10340 - All in All(字符串匹配)

题目:10340 - All in All 题目大意:给出字符串s和t,问s是否是t的子串.s若去掉某些字符能和t一样,那么t是s的子串. 解题思路:匹配字符.t的每个字符和s中的字符匹配.注意这里的字符数组大小要开大点. 代码: #include <stdio.h> #include <string.h> const int N = 1000005; char s[N], t[N]; bool match () { int i = 0; int lens = strlen(s);

uva:10487 - Closest Sums(二分查找)

题目:10487 - Closest Sums 题目大意:给出一组数据,再给出m个查询的数字.要求找到这组数据里的两个数据相加的和最靠近这个查询的数据,输出那两个数据的和. 解题思路:二分查找,这样找到的话,就输出查询的数值,但是要注意找不到的情况:这里最靠近的值不一定是在找不到的时刻的前一次数据,所以要维护最靠近的要查询数的数值. 代码: #include <stdio.h> #include <algorithm> #include <stdlib.h> using