NOIP模拟 road【tarjan】

本文介绍了一种解决特定有向图中任意两点间最短路径之和的问题的方法。该方法首先通过Tarjan算法识别强连通分量,并将其视为环。然后将图简化为由基环内向树组成的森林,单独计算每个环的贡献,最后处理树上的边。
题目链接:

给一个n个点,n条边的有向图,求任意不同两点间最短路之和(不连通的算作-1)。(1<=n<=500000)

解题思路:

容易发现这是一个由基环内向树组成的森林,所以其中的强联通分量一定是环,且每棵树只有一个,那么我们可以先用tarjan求出环单独计算环的贡献,再缩点后处理树上的边。

讲真,这题的取模太恶心了……考试时硬生生WA了一半,以后要引以为戒。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#define ll long long
using namespace std;

int getint()
{
    int i=0,f=1;char c;
    for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar());
    if(c=='-')f=-1,c=getchar();
    for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0';
    return i*f;
}

const int N=500005,p=1e9+7;
int n;
int go[N],len[N];
int tot,first[N],nxt[N],to[N],w[N];
int idx,top,dfn[N],low[N],stk[N];
int num,id[N],size[N];
ll sum[N],val[N],ans;
vector<int>f[N];
bool exist[N];

inline void add(int x,int y,int z)
{
    nxt[++tot]=first[x],first[x]=tot,to[tot]=y,w[tot]=z;
}

inline void tarjan(int u)
{
    dfn[u]=low[u]=++idx;
    stk[++top]=u,exist[u]=true;
    int v=go[u];
    if(!dfn[v])
    {
        tarjan(v);
        low[u]=min(low[u],low[v]);
    }
    else 
        if(exist[v])low[u]=min(low[u],dfn[v]);
    if(low[u]==dfn[u])
    {
        ++num;
        v=stk[top];
        while(v!=u)
        {
            id[v]=num,size[num]++;
            f[num].push_back(v);
            top--,exist[v]=false,v=stk[top];
        }
        id[v]=num,size[num]++;
        f[num].push_back(v);
        top--,exist[v]=false;
    }
}

inline void calc(int i)
{
    reverse(f[i].begin(),f[i].end());
    for(int j=0;j<size[i];j++)
        val[f[i][0]]=(val[f[i][0]]+1ll*(size[i]-j)*len[f[i][j]]%p)%p;
    for(int j=1;j<size[i];j++)
        val[f[i][j]]=(val[f[i][j-1]]+sum[i]-1ll*size[i]%p*len[f[i][j-1]]%p)%p;
    for(int j=0;j<size[i];j++)
        val[f[i][j]]=(val[f[i][j]]-sum[i])%p;   
}

inline void dfs(int u,int cnt)
{
    exist[u]=true;
    ans=((ans-1ll*(n-cnt)*size[u])%p+p)%p;
    for(int e=first[u];e;e=nxt[e])
    {
        int v=to[e];
        if(!exist[v])dfs(v,cnt+size[v]);
        ans=(ans+1ll*size[v]*cnt%p*w[e]%p)%p;
        size[u]+=size[v];
    }
}

int main()
{
    //freopen("road.in","r",stdin);
    //freopen("road.out","w",stdout);
    int i,y,z;
    n=getint();
    for(i=1;i<=n;i++)
        go[i]=getint(),len[i]=getint();
    for(i=1;i<=n;i++)
        if(!dfn[i])tarjan(i);
    for(i=1;i<=n;i++)
        if(id[go[i]]==id[i])sum[id[i]]=(sum[id[i]]+len[i])%p;
        else add(id[go[i]],id[i],len[i]);
    for(i=1;i<=num;i++)
    {
        if(size[i]==1)continue;
        ans=(ans+1ll*size[i]*(size[i]-1)/2%p*sum[i]%p)%p;
        calc(i);
    }
    memset(exist,0,sizeof(exist));
    for(i=1;i<=num;i++)
        if(!exist[i])dfs(i,size[i]);
    for(i=1;i<=n;i++)
        if(id[go[i]]!=id[i])ans=(ans+1ll*size[id[i]]*val[go[i]]%p)%p;
    cout<<(ans%p+p)%p;
    return 0;
}
【电力系统】单机无穷大电力系统短路故障暂态稳定Simulink仿真(带说明文档)内容概要:本文档围绕“单机无穷大电力系统短路故障暂态稳定Simulink仿真”展开,提供了完整的仿真模型与说明文档,重点研究电力系统在发生短路故障后的暂态稳定性问题。通过Simulink搭建单机无穷大系统模型,模拟不同类型的短路故障(如三相短路),分析系统在故障期间及切除后的动态响应,包括发电机转子角度、转速、电压和功率等关键参数的变化,进而评估系统的暂态稳定能力。该仿真有助于理解电力系统稳定性机理,掌握暂态过程分析方法。; 适合人群:电气工程及相关专业的本科生、研究生,以及从事电力系统分析、运行与控制工作的科研人员和工程师。; 使用场景及目标:①学习电力系统暂态稳定的基本概念与分析方法;②掌握利用Simulink进行电力系统建模与仿真的技能;③研究短路故障对系统稳定性的影响及提高稳定性的措施(如故障清除时间优化);④辅助课程设计、毕业设计或科研项目中的系统仿真验证。; 阅读建议:建议结合电力系统稳定性理论知识进行学习,先理解仿真模型各模块的功能与参数设置,再运行仿真并仔细分析输出结果,尝试改变故障类型或系统参数以观察其对稳定性的影响,从而深化对暂态稳定问题的理解。
本研究聚焦于运用MATLAB平台,将支持向量机(SVM)应用于数据预测任务,并引入粒子群优化(PSO)算法对模型的关键参数进行自动调优。该研究属于机器学习领域的典型实践,其核心在于利用SVM构建分类模型,同时借助PSO的全局搜索能力,高效确定SVM的最优超参数配置,从而显著增强模型的整体预测效能。 支持向量机作为一种经典的监督学习方法,其基本原理是通过在高维特征空间中构造一个具有最大间隔的决策边界,以实现对样本数据的分类或回归分析。该算法擅长处理小规模样本集、非线性关系以及高维度特征识别问题,其有效性源于通过核函数将原始数据映射至更高维的空间,使得原本复杂的分类问题变得线性可分。 粒子群优化算法是一种模拟鸟群社会行为的群体智能优化技术。在该算法框架下,每个潜在解被视作一个“粒子”,粒子群在解空间中协同搜索,通过不断迭代更新自身速度与位置,并参考个体历史最优解和群体全局最优解的信息,逐步逼近问题的最优解。在本应用中,PSO被专门用于搜寻SVM中影响模型性能的两个关键参数——正则化参数C与核函数参数γ的最优组合。 项目所提供的实现代码涵盖了从数据加载、预处理(如标准化处理)、基础SVM模型构建到PSO优化流程的完整步骤。优化过程会针对不同的核函数(例如线性核、多项式核及径向基函数核等)进行参数寻优,并系统评估优化前后模型性能的差异。性能对比通常基于准确率、精确率、召回率及F1分数等多项分类指标展开,从而定量验证PSO算法在提升SVM模型分类能力方面的实际效果。 本研究通过一个具体的MATLAB实现案例,旨在演示如何将全局优化算法与机器学习模型相结合,以解决模型参数选择这一关键问题。通过此实践,研究者不仅能够深入理解SVM的工作原理,还能掌握利用智能优化技术提升模型泛化性能的有效方法,这对于机器学习在实际问题中的应用具有重要的参考价值。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值