Connections Gym - 101630C

本文介绍了一种通过两遍BFS算法选取特定数量的有向边来构建强连通分量的方法,确保图中所有节点两两互相可达。首先从节点1开始正向搜索选择边,再反向搜索,最终输出未被选中的边。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://codeforces.com/gym/101630/attachments

给m条有向边 选其中2*n条构成一个强连通分量

队友想到的 跑两遍以1为起点的bfs 第一遍在原图上选出n-1条边 保证1可达2-n 第二遍反向建图 保证2-n可达1

把两遍选中的边凑在一起 任一点都是与1互相可达的 那整个图就两两互相可达了

 

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
const int maxm=1e5+10;

struct node1
{
    int u,v;
};

struct node2
{
    int id,v,next;
};

node1 pre[maxm];
node2 edge[maxm];
int first[maxn],book[maxn],vis[maxn];
int n,m,num;

void addedge(int id,int u,int v)
{
    edge[num].id=id;
    edge[num].v=v;
    edge[num].next=first[u];
    first[u]=num++;
}

void dfs(int cur)
{
    int i,id,v;
    for(i=first[cur];i!=-1;i=edge[i].next){
        id=edge[i].id,v=edge[i].v;
        if(!vis[v]){
            book[id]++,vis[v]=1;
            dfs(v);
        }
    }
}

int main()
{
    int t,i,cnt;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        for(i=1;i<=m;i++) scanf("%d%d",&pre[i].u,&pre[i].v);

        for(i=1;i<=m;i++) book[i]=0;

        for(i=1;i<=n;i++){
            first[i]=-1;
            vis[i]=0;
        }
        num=0;
        for(i=1;i<=m;i++) addedge(i,pre[i].u,pre[i].v);
        vis[1]=1;
        dfs(1);

        for(i=1;i<=n;i++){
            first[i]=-1;
            vis[i]=0;
        }
        num=0;
        for(i=1;i<=m;i++) addedge(i,pre[i].v,pre[i].u);
        vis[1]=1;
        dfs(1);

        cnt=m-2*n;
        for(i=1;i<=m&&cnt>0;i++){
            if(book[i]==0){
                printf("%d %d\n",pre[i].u,pre[i].v);
                cnt--;
            }
        }
    }
    return 0;
}

 

构建图中所示的拓扑结构。图中有两个流(s1 → d1 和 s2 → d2)需要在该拓扑上传输数据。可以看出,这两个流将竞争链路 r1 → r2 的带宽。因此,每个流的源端都配备了拥塞控制算法,以调节发送速率,从而高效且公平地利用网络带宽。在本项目中,您需要在源端使用不同的拥塞控制算法(Reno 和 CUBIC),以比较它们的性能。 具体而言,部分参数设置如下: 数据包大小:1KB 链路传播延迟:0.1秒 每个端口的队列长度:100 个数据包 env.run(until=500)(这意味着您需要记录的时间为 500 秒。) 其他参数可以参考给定的示例代码进行设置。测试用例包括: s1 和 s2 都采用 Reno 算法; s1 采用 Reno 算法,s2 采用 CUBIC 算法。 请记录并绘制两种情况下两个流的窗口大小和发送速率的变化,然后在报告中分析相应结果。 图 1: 网络拓扑示例。链路上的数字(单位为 Mbps)表示链路的容量。 这张图展示了一个简单的计算机网络拓扑结构,包括源节点 (sources)、路由器 (routers) 和目的节点 (destinations)。具体描述如下: - **节点**: - 两个源节点:\( s_1 \) 和 \( s_2 \)(用红色圆圈表示)。 - 两个路由器:\( r_1 \) 和 \( r_2 \)(用灰色圆圈表示)。 - 两个目的节点:\( d_1 \) 和 \( d_2 \)(用绿色圆圈表示)。 - **连接与链路容量**: - \( s_1 \) 连接到 \( r_1 \),链路容量为 1 Mbps。 - \( s_2 \) 连接到 \( r_1 \),链路容量为 1 Mbps。 - \( r_1 \) 连接到 \( r_2 \),链路容量为 1 Mbps。 - \( r_2 \) 连接到 \( d_1 \),链路容量为 1 Mbps。 - \( r_2 \) 连接到 \( d_2 \),链路容量为 1 Mbps。 - **链路方向**: - 图中的箭头指示了数据流动的方向,例如数据从 \( s_1 \) 和 \( s_2 \) 发送到 \( r_1 \),然后传输到 \( r_2 \),最终到达 \( d_1 \) 和 \( d_2 \)。 请你给出完整的实现代码,要求严格按照示例的格式和命名规则来编写,比如必须是from ns.flow.cubic import TCPCubic、链路传播延迟:0.1秒等,不要随意篡改数据,尽量不要自创一些新方法
最新发布
03-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值