Week8 作业C 选班长 SCC Kosaraju

本文介绍了一种解决大学班长选举问题的算法,通过构建图论中的强连通分量(SCC)并进行缩点,计算每个SCC的票数,最终确定得票最多的候选人。使用Kosaraju算法求解SCC,再通过DFS遍历计算票数。

题目描述

大学班级选班长,N 个同学均可以发表意见
若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适
勤劳的 TT 收集了M条意见,想要知道最高票数,并给出一份候选人名单,即所有得票最多的同学,你能帮帮他吗?
在这里插入图片描述

样例

Input
2
4 3
3 2
2 0
2 1

3 3
1 0
2 1
0 2
Output
Case 1: 2
0 1
Case 2: 2
0 1 2

思路分析

本题方法:求出SCC并缩点, 计算每个SCC票数。

求SCC:Kosaraju

第一遍dfs遍历原图,得到逆后序序列。

第二遍dfs在反图中按逆后序序列遍历,每次由起点遍历到的点构成一个SCC,在遍历同时记录该SCC中点数。

缩点:

将一个SCC看作一个点,建立新图。不在同一个SCC中的两个点u、v,且u可到达v,SCC编号为c[u],c[v],将边(c[u],c[v])插入到新图中。同时得到新图中每个点的入度。

求票数:

对第i个SCC来说,其中点的票数等于=第i个SCC中的点数+所有能到达i的SCC中的点数-1。用dfs遍历得到每个SCC的点的票数(同一个SCC中点两两相连,票数相同),找到票数最高的SCC,其中的点就是票数最高的点。
注意输出要求

AC代码

#include<iostream>
#include<queue>
#include<cstring>
#include<cmath>
using namespace std;
int head[5005],head1[5005],head2[5005];
int vis[5005],vis2[5005],dfn[5005],c[5005],scc[5005],in_deg[5005],ans[5005],sum[5005];
struct Edge
{
 int v,next;//相邻的点,权值,下条边的序号 
} ;
int tot,tot1,tot2,dcnt,scnt,n,m,temp; 
Edge edge[50000],edge1[50000],edge2[50000];
void init()
{
 //初始化 
 tot=0;tot1=0;tot2=0;
 memset(head,-1,sizeof(head));
 memset(head1,-1,sizeof(head));
 memset(head2,-1,sizeof(head));
 memset(vis,0,sizeof(vis));
 memset(vis2,0,sizeof(vis2));
 memset(dfn,0,sizeof(dfn));
 memset(c,0,sizeof(c));
 memset(scc,0,sizeof(scc));
 memset(in_deg,0,sizeof(in_deg));
 memset(ans,0,sizeof(ans));
 memset(sum,0,sizeof(sum));
 } 
void add(int u,int v)
{
 edge[tot].v=v;
 edge[tot].next=head[u];
 head[u]=tot;
 tot++;
}
void add1(int u,int v)
{
 edge1[tot1].v=v;
 edge1[tot1].next=head1[u];
 head1[u]=tot1;
 tot1++;
}
void add2(int u,int v)
{
 edge2[tot2].v=v;
 edge2[tot2].next=head2[u];
 head2[u]=tot2;
 tot2++;
}
void dfs(int u) 
{
 vis[u]=1; 
 for (int i= head[u];~i;i= edge[i].next)
 {
        int v=edge[i].v;
  if(vis[v]==0)
  {
   dfs(v);
  }
 }
 dfn[dcnt++]=u;
}
void dfs1(int u) 
{
 c[u]=scnt;
 scc[scnt]++; //scc中点数 
 for (int i= head1[u];~i;i= edge1[i].next)
 {
  int v=edge1[i].v;
  if(c[v]==0)
  {
   dfs1(v);
  }
 }
}
void dfs2(int u) 
{
 vis2[u]=1;
 temp+=scc[u];
 for (int i= head2[u];~i;i=edge2[i].next)
 {
        int v=edge2[i].v;
  if(vis2[v]==0)
  {
   dfs2(v);
  }
 }
}
void kosaraju()
{
    dcnt=0;
 scnt=0;
 for(int i=0;i<n; i++)
 {
  if(!vis[i]) dfs(i);
 } 
 for(int i=n-1; i>=0; i--)
 {
  if(!c[dfn[i]])
  {
   ++scnt;
   dfs1(dfn[i]);
  } 
 } 
}
int main()
{
    ios::sync_with_stdio(false);
    int T;
    cin>>T;
    for(int count=1;count<=T;count++)
    {
     init();//初始化
  cin>>n>>m;
  int A,B;
  for(int i=0;i<m;i++)
  {
   cin>>A>>B;
   add(A,B);//原图
   add1(B,A);//反图 
  }
  kosaraju();
  //缩点
     for (int u=0;u<n;u++)
  {
      for (int i=head1[u];~i;i=edge1[i].next) 
   {
        int v=edge1[i].v;
       if(c[u]==c[v]) continue;//在同一个SCC中 
       add2(c[u],c[v]);//缩点后的图 
       in_deg[c[v]]++;//入度 
         }
      } 
      int Max=0;
      for(int i=1;i<=scnt;i++)
      {
       if(in_deg[i]==0)
       {
        memset(vis2,0,sizeof(vis2));//注意!!! 
        temp=0;
        dfs2(i);
        sum[i]=temp-1;
       //cout<<"in_deg "<<i<<" "<<sum[i]<<endl;
        Max=max(Max,sum[i]);
    }
  }
  for(int i=1;i<=scnt;i++)
  {
   if(sum[i]==Max)
   {
    //cout<<"ans "<<i<<endl;
    ans[i]=1;//标记最大 
   }
  }
  cout<<"Case "<<count<<": "<<Max<<endl;
  bool flag=false;
  for(int i=0;i<n;i++)
  {
   //cout<<i<<" "<<c[i]<<" "<<ans[c[i]]<<endl; 
   if(ans[c[i]])
   {
    if(!flag)
    {
     cout<<i;
     flag=true; 
    }
    else
    {
     cout<<" "<<i;
    }
   }
  }
  cout<<endl;
    } 
    return 0;
}
基于TROPOMI高光谱遥感仪器获取的大气成分观测资料,本研究聚焦于大气污染物一氧化氮(NO₂)的空间分布与浓度定量反演问题。NO₂作为影响空气质量的关键指标,其精确监测对环境保护与大气科学研究具有显著价值。当前,利用卫星遥感数据结合先进算法实现NO₂浓度的高精度反演已成为该领域的重要研究方向。 本研究构建了一套以深度学习为核心的技术框架,整合了来自TROPOMI仪器的光谱辐射信息、观测几何参数以及辅助气象数据,形成多维度特征数据集。该数据集充分融合了不同来源的观测信息,为深入解析大气中NO₂的时空变化规律提供了数据基础,有助于提升反演模型的准确性与环境预测的可靠性。 在模型架构方面,项目设计了一种多分支神经网络,用于分别处理光谱特征与气象特征等多模态数据。各分支通过独立学习提取代表性特征,并在深层网络中进行特征融合,从而综合利用不同数据的互补信息,显著提高了NO₂浓度反演的整体精度。这种多源信息融合策略有效增强了模型对复杂大气环境的表征能力。 研究过程涵盖了系统的数据处理流程。前期预处理包括辐射定标、噪声抑制及数据标准化等步骤,以保障输入特征的质量与一致性;后期处理则涉及模型输出的物理量转换与结果验证,确保反演结果符合实际大气浓度范围,提升数据的实用价值。 此外,本研究进一步对不同功能区域(如城市建成区、工业带、郊区及自然背景区)的NO₂浓度分布进行了对比分析,揭示了人类活动与污染物空间格局的关联性。相关结论可为区域环境规划、污染管控政策的制定提供科学依据,助力大气环境治理与公共健康保护。 综上所述,本研究通过融合TROPOMI高光谱数据与多模态特征深度学习技术,发展了一套高效、准确的大气NO₂浓度遥感反演方法,不仅提升了卫星大气监测的技术水平,也为环境管理与决策支持提供了重要的技术工具。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rwyoi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值