【CQOI2015】网络吞吐量

传送门:NKOJ3250

这是一道网络流水题(水题过不了系列=-=)。
题解:首先跑最短路(SPFA,dijkstra),然后枚举每一条边判断它是否是在最短路上,再用最短路上的边建好图跑一次最大流即可。

感谢@Mogician_Evian 帮我看丑代码。(模板题都要WA的我还是太菜了)

以下是我的丑代码:这里写图片描述

#include<stdio.h>
#include<cstring>
#include<queue>
#include<cmath>
#define LL long long
const LL inf=1e18;
const int MAXN=505<<1;
const int MAXM=100005<<1;
using namespace std;
LL n,m,A[MAXM],B[MAXM],D[MAXM];
LL Last[MAXN],Next[MAXM],To[MAXM],pid;
LL Len[MAXM];
void Storepath(LL u,LL v,LL l){
    To[++pid]=v,Next[pid]=Last[u],Last[u]=pid,Len[pid]=l;
}
queue<LL>Q;
LL dis[MAXN][3];
bool ifin[MAXN];
void SPFA(LL St,LL fl){
    for(int i=2;i<=n;i++)dis[i][fl]=inf;
    dis[St][fl]=0,Q.push(St),ifin[St]=1;
    LL tmp;
    while(Q.size()){
        tmp=Q.front(),Q.pop(),ifin[tmp]=0;
        for(int i=Last[tmp];i;i=Next[i]){
            if(dis[To[i]][fl]>dis[tmp][fl]+Len[i]){
                dis[To[i]][fl]=dis[tmp][fl]+Len[i];
                if(!ifin[To[i]]){
                    Q.push(To[i]),ifin[To[i]]=1;
                }
            }
        }
    }
}
int CNT[MAXN],DIS[MAXN],START,END;
LL W[MAXN],WW,ANS,WWW[MAXN][MAXN];
LL SAP(LL U,LL FLOW){
    if(U==END)return FLOW;
    LL OUT=0,TMP;
    for(int I=1;I<=n;I++){
        if(DIS[I]+1!=DIS[U]||WWW[U][I]<=0)continue;
        OUT+=TMP=SAP(I,min(FLOW-OUT,WWW[U][I]));
        WWW[U][I]-=TMP,WWW[I][U]+=TMP;
        if(OUT==FLOW||DIS[START]>=END)return OUT;
    }
    if(!--CNT[DIS[U]])DIS[START]=END;
    CNT[++DIS[U]]++;
    return OUT;
}
LL ORZ[MAXN];
int main(){
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=m;i++){
        scanf("%lld%lld%lld",&A[i],&B[i],&D[i]);
        Storepath(A[i],B[i],D[i]),Storepath(B[i],A[i],D[i]);
    }
    SPFA(1,1),SPFA(n,2);
    for(int i=1;i<=n;i++)scanf("%lld",&ORZ[i]);
    ORZ[1]=ORZ[n]=inf;
    for(int i=1;i<=m;i++)
        if(dis[A[i]][1]+D[i]+dis[B[i]][2]==dis[n][1]||dis[B[i]][1]+D[i]+dis[A[i]][2]==dis[n][1])
            WWW[A[i]][B[i]]=WWW[B[i]][A[i]]=min(ORZ[A[i]],ORZ[B[i]]);
    START=1,END=n;
    while(DIS[START]<END)ANS+=SAP(START,inf);
    printf("%lld",ANS);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DCN网络吞吐量仿真主要是通过使用MATLAB软件来进行网络性能的模拟和评估。这个仿真过程可以帮助我们理解和分析数据通信网络中的吞吐量问题,以及对网络性能的影响因素进行研究。 首先,在进行DCN网络吞吐量仿真之前,我们需要确定仿真的目标和参数设置。我们需要定义网络拓扑结构、链路带宽、传输协议、队列调度算法等参数,以便模拟具体的网络环境。 其次,我们使用MATLAB的仿真工具箱来建立网络模型。通过建立合适的数学模型,我们可以模拟各种网络节点之间的通信过程。这些节点可以是路由器、交换机、主机等。 接下来,我们需要确定各个节点之间的传输规则和量模式。这些规则和模式包括数据包大小、传输速率、传输延迟等。我们可以根据实际的应用需求对这些参数进行调整,以得到准确的结果。 然后,我们利用MATLAB的仿真工具来进行网络吞吐量的计算和评估。通过模拟数据包在网络中的传输过程,我们可以得到各个节点的数据传输速度,并根据这些速度来计算网络吞吐量。同时,我们还可以评估不同的网络参数对吞吐量的影响,如带宽、传输延迟等。 最后,我们可以通过分析仿真结果来优化网络的性能。根据吞吐量的变化趋势,我们可以调整网络参数,改变网络拓扑结构,优化传输协议等,从而提高网络的性能和吞吐量。 总而言之,MATLAB可以作为一个强大的工具来进行DCN网络吞吐量仿真。通过模拟网络环境和数据传输过程,我们可以评估网络的性能,并提出相应的优化措施。这对于设计高效的数据通信网络具有重要的意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值