wikioi 1034 家 实时动态的网络流量(费用流)

因为随着时间的推移。网络侧变得,因此,常见的网络流量也解决不了这个问题,。如果T毕竟运输时间。

为此。我们可以基于时间分割点,所有的点将被分割为T点。

对于每一个点,下一次甚至一个容量为本人INF边缘,费用1边缘。这意味着目前的空间站等待1。

每一个点对于下一个时刻能到的点。连一条边,容量是这艘太空船的容量,费用是1。

源点连0时刻的地球,容量为k,全部的月球连接汇点。费用都为0。

每次找到一条最短路进行增广。若增广流量达到总人数,则退出。

这时候找到最后到达月球的时刻,就是终于时刻。

建图的样子。

#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define MAXN 10000
#define MAXM 1000000
#define INF 0x3f3f3f3f
struct node
{
	int u,v,f,c,next;
}e[MAXM];
int n,head[MAXN],pre[MAXN],dist[MAXN],vis[MAXN],ans;
int en,s,t,maxflow,mincost; //s源点。t汇点
void add(int u,int v,int c,int f)//加边
{
	e[en].u=u;
	e[en].v=v;
	e[en].c=c;
	e[en].f=f;
	e[en].next=head[u];
	head[u]=en++;
	e[en].u=v;
	e[en].v=u;
	e[en].c=-c;
	e[en].f=0;
	e[en].next=head[v];
	head[v]=en++;
}
int spfa()
{
	int i,u,v;
	for(i=0;i<=t;i++)
		pre[i]=-1,vis[i]=0,dist[i]=INF;
	dist[s]=0;
	vis[s]=1;
	queue<int>q;
	q.push(s);
	while(!q.empty())
	{
		u=q.front();
		q.pop();
		for(i=head[u];i!=-1;i=e[i].next)
		{
			v=e[i].v;
			if(e[i].f>0&&dist[u]+e[i].c<dist[v])
			{
				dist[v]=dist[u]+e[i].c;
				pre[v]=i;
				if(!vis[v])
				{
					vis[v]=1;
					q.push(v);
				}
			}
		}
		vis[u]=0;
	}
	if(dist[t]==INF)
		return 0;
	return 1;
}
void add()
{
	int v;
	int maxf=INF;
	for(v=pre[t];~v;v=pre[e[v].u])
		maxf=min(maxf,e[v].f);
	for(v=pre[t];~v;v=pre[e[v].u])
	{
		e[v].f-=maxf;
		e[v^1].f+=maxf;
	}
	ans=max(ans,e[pre[t]].u);//保存最后到达月球的时刻,越后面下标越大。
	maxflow+=maxf;
}
void init()
{
    maxflow=0;
    mincost=0;
    en=0;
    memset(head,-1,sizeof(head));
}
int num[55][55],have[55],r[55];
int main()
{
	int i,j,a,b,c,m,k;
	while(scanf("%d%d%d",&n,&m,&k)!=EOF)
	{
	    ans=0;
	    init();
	    for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&r[i],&have[i]);
            for(int j=0;j<have[i];j++)
            {
                scanf("%d",&num[i][j]);
                if(num[i][j]==-1) num[i][j]=n+1;
            }
        }
        int T=100;
        s=(n+2)*(T+1);
        t=s+1;
        add(s,0,0,k);
        for(int i=0;i<=T;i++)
        {
            if(i!=T) for(int j=0;j<=n+1;j++) add(j*(T+1)+i,j*(T+1)+i+1,1,INF);   //在此空间站停留到下一时刻
            if(i==0) continue;
            for(int x=1;x<=m;x++)
            {
                int times=i%have[x];
                int from,to;
                if(times==0) from=num[x][have[x]-1],to=num[x][times];
                else from=num[x][times-1],to=num[x][times];
                add(from*(T+1)+i-1,to*(T+1)+i,1,r[x]);                     //i时刻从from到to空间站
            }
        }
        for(int i=(n+1)*(T+1);i<=(n+1)*(T+1)+T;i++) add(i,t,0,INF);
		while(spfa())
			add();
        if(maxflow==k) printf("%d\n",ans%(T+1));
        else puts("0");
	}
	return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2025-01-13 17:17:55

wikioi 1034 家 实时动态的网络流量(费用流)的相关文章

[ZJOI2010][bzoj1834] 网络扩容 [费用流]

题面 传送门 思路 第一问:无脑网络流跑一波 第二问: 先考虑一个贪心的结论:扩容出来的扩容流量一定要跑满 证明显然 因此我们可以把扩容费用可以换个角度思考,变成增加一点流量,花费W的费用 这样,我们就得到了一个最小费用流的模型 只要在原图基础上,对于每个原图边,加一条费用为W,无限容量的边,而原图中的所有边费用为0,就可以模拟原题需要的情况了 最后一个问题:流量增加限制K怎么处理? 我们虽然可以用spfa的费用流,一次一次增加,直到K,但是这样也太慢chou了吧? 不怕,我们加一个n+1号点,

luogu P2604 [ZJOI2010]网络扩容 |费用流

题目描述 给定一张有向图,每条边都有一个容量\(C\)和一个扩容费用\(W\).这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: 2. 将1到N的最大流增加K所需的最小扩容费用. 输入格式 输入文件的第一行包含三个整数\(N,M,K\),表示有向图的点数.边数以及所需要增加的流量. 接下来的M行每行包含四个整数\(u,v,C,W\),表示一条从u到v,容量为C,扩容费用为W的边. 输出格式 输出文件一行包含两个整数,分别表示问题1和问题2的答案. 利用残余网

【BZOJ1834】network 网络扩容(最大流,费用流)

题意:给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1. 在不扩容的情况下,1到N的最大流: 2. 将1到N的最大流增加K所需的最小扩容费用. 30%的数据中,N<=100 100%的数据中,N<=1000,M<=5000,K<=10 思路:RYZ作业 第一问最大流即可 第二问网上很多题解都是在第一问的残余网络上构图,但是根本不需要 考虑边(x,y,z,w) 有容量为z,费用为0的免费流量,有容量为INF,费用为w的扩容付费流

Ntop监控网络流量

运用Ntop监控网络流量 ____ 网络流量反映了网络的运行状态,是判别网络运行是否正常的关键数据,在实际的网络中,如果对网络流量控制得不好或发生网络拥塞,将会导致网络吞吐量下降. 网络性能降低.通过流量测量不仅能反映网络设备(如路由器.交换机等)的工作是否正常,而且能反映出整个网络运行的资源瓶颈,这样管理人员就可以根据网络 的运行状态及时采取故障补救措施和进行相关的业务部署来提高网络的性能.对网络进行流量监测分析,可以建立网络流量基准,通过连接会话数的跟踪.源/目的 地址对分析.TCP流的分析

基于网络流量统计与反馈实现边缘机房间媒体流流量调度的一种思路

目前服务于Web与移动直播的流媒体系统,一般由于骨干网核心机房网络质量有保证,同时媒体流发布客户端如果到服务器的网络出现卡顿现像,会影响所有流媒体播放端用户,因此为保护媒体流发布客户端至服务器的网络质量,多数是在骨干网核心机房部署源流媒体服务器,媒体流发布客户端将媒体流发布于源流媒体(也就是说只提供发布流服务),源流媒体服务器之间通过媒体流状态管理服务器共享媒体流状态信息,进而实现源流媒体服务器间互相按一定规则传输媒体流,每台源流媒体下面再依树形结构挂载多级中转流媒体服务器(提供从上到下的中继中

【最大流】【费用流】bzoj1834 [ZJOI2010]network 网络扩容

引用题解: 最大流+费用流. 第一问最大流即可. 第二问为“最小费用最大流”. 由题意,这一问的可转化为在上一问的“残量网络”上,扩大一些边的容量,使能从新的图中的最大流为k. 那么易得:对于还有剩余流量的边,走过他们的费用为0.而“增加流量”可变为:对残留网络上的每一条边建一条容量是∞费用是w的边.这表示从这些边走,每一流量的费用为w,这就符合题意了. 最后建一个超级源点,从超级源向1建一条容量为k,费用为0的边,就可进行最小费用最大流算法. #include<cstdio> #includ

【BZOJ】1834: [ZJOI2010]network 网络扩容(最大流+费用流)

我又思考人生了T_T,nd的数组开小了,一直wa,调了一个小时才发现啊!!!!!我一直以为我的isap错了T_T,可是完全没错啊!!!! 这题其实第一个问很简单,跑一次最大流即可.第二个问就是在跑完最大流的残量网络上每条边都扩充容量为oo,费用为边的费用,然后设个超级源连一条容量为k的边到点1,再跑一次费用流即可. 理由很简单,自己想,我就不说了. #include <cstdio> #include <cstring> #include <cmath> #includ

bzoj 1834: [ZJOI2010]network 网络扩容 -- 最大流+费用流

1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec  Memory Limit: 64 MB Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: 2. 将1到N的最大流增加K所需的最小扩容费用. Input 输入文件的第一行包含三个整数N,M,K,表示有向图的点数.边数以及所需要增加的流量. 接下来的M行每行包含四个整数u,v,C,W,表示一

网络流量查看

下载软件#cd /home/tools/#wget http://soft.vpser.net/status/vnstat/vnstat_php_frontend-1.5.1.tar.gz#http://download.chinaunix.net/download.php?id=22078&ResourceID=11145 (需要打开浏览器,下载软件包,然后上传到服务器上) 安装#cd /home/tools/#tar zxvf vnstat-1.4.tar.gz#cd vnstat-1.4#