P5157 [USACO18DEC]The Cow Gathering

题目链接

题意分析

题意

给你一棵树 每一次都会删除一个叶子节点 同时树上存在一些有向边\((a,b)\)

必须满足\(a\)\(b\)之前删除

问每一个节点作为根节点时是否存在合法的删边情况 使得跟、根节点被最后一个删除


换根\(dp\)\(No\)

首先有向边必定形成一个或者多个\(DAG\)

所以先判断是否有环

然后做做这道题 遥远的国度

以当前点作为根节点不合法的情况就是

存在有向边\((a,b)\)满足\(a\)\(b\)的祖先

那么我们对于每一条有向边分开讨论判断那些节点在当前有向边情况下可以成为根节点

同那道题 分情况讨论

1.\(a\)\(b\)的祖先

那么只有\(a\)的子树(不包括\(a\))可以成为根节点

2.\(a\)不是\(b\)的祖先

那么只有\(a\)的子树(包括\(a\))不可以成为根节点

然后我们使用\(dfs\)序实现区间覆盖就可以了

CODE:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<deque>
#include<vector>
#include<ctime>
#define ll long long
#define inf 0x7fffffff
#define N 500008
#define IL inline
#define M 508611
#define D double
#define ull unsigned long long
#define R register
using namespace std;
template<typename T>IL void read(T &_)
{
    T __=0,___=1;char ____=getchar();
    while(!isdigit(____)) {if(____=='-') ___=0;____=getchar();}
    while(isdigit(____)) {__=(__<<1)+(__<<3)+____-'0';____=getchar();}
    _=___ ? __:-__;
}
/*-------------OI使我快乐-------------*/
int n,m,tot,cnt,top,all;
int to[M],nex[M],head[M],ans[M];
int dep[M],fath[M][20],siz[M];
int dfn[M],wt[M],tre[M],in[M];
int dfnn[M],low[M],sta[M];
bool vis[M];
vector<int> G[M];
bool flag;
IL void add_edge(int x,int y)
{;to[++tot]=y;nex[tot]=head[x];head[x]=tot;}
IL void add(int x,int y)
{for(;x<=n;x+=x&-x) tre[x]+=y;}
IL int qury(int x)
{int res=0;for(;x;x-=x&-x) res+=tre[x];return res;}
IL void dfs(int now,int fat,int deep)
{
    dep[now]=deep;fath[now][0]=fat;dfn[now]=++cnt;wt[cnt]=now;siz[now]=1;
    for(R int i=1;i<=19;++i) fath[now][i]=fath[fath[now][i-1]][i-1];
    for(R int i=head[now];i;i=nex[i])
    {
        int v=to[i];
        if(v==fat) continue;
        dfs(v,now,deep+1);
        siz[now]+=siz[v];
    }
}
IL int LCA(int nowx,int nowy)
{
    if(dep[nowx]<dep[nowy]) swap(nowx,nowy);
    for(R int i=19;i>=0;--i)
    if(dep[fath[nowx][i]]>=dep[nowy]) nowx=fath[nowx][i];
    if(nowx==nowy) return nowx;
    for(R int i=19;i>=0;--i)
    if(fath[nowx][i]!=fath[nowy][i]) 
    nowx=fath[nowx][i],nowy=fath[nowy][i];
    return fath[nowx][0];
}
IL void update(int x,int y)
{
    if(x>y) return;
    add(x,1);add(y+1,-1);
}
IL void Tarjan(int now)
{
    dfnn[now]=low[now]=++cnt;
    vis[now]=1;sta[++top]=now;
    for(R int i=0;i<(int)G[now].size();++i)
    {
        int v=G[now][i];
        if(!dfnn[v]) Tarjan(v),low[now]=min(low[now],low[v]);
        else if(vis[v]) low[now]=min(low[now],dfnn[v]);
    }
    if(low[now]==dfnn[now])
    {
        all=0;
        while(sta[top+1]!=now)
        {
            ++all;
            vis[sta[top--]]=0;
        }
        if(all>1) flag=1;
    }
}
int main()
{
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);
    read(n);read(m);
//  puts("0");return 0;
    for(R int i=1,x,y;i<n;++i)
    {
        read(x);read(y);
        add_edge(x,y);add_edge(y,x);
    }
    dfs(1,0,1);
//  for(R int i=1;i<=n;++i) printf("%d%c",siz[i],(i==n ? '\n':' '));
    for(R int i=1,x,y;i<=m;++i)
    {
        read(x);read(y);
        G[x].push_back(y);
        int lca=LCA(x,y);
//      printf("lca=%d\n",lca);
        if(lca==x)
        {
//          puts("now cdy");
            int now=y;
            for(R int i=19;i>=0;--i)
            if(fath[now][i]&&dep[fath[now][i]]>dep[x]) now=fath[now][i];
//          printf("now at %d\n",now);
//          printf("(%d , %d)\n",dfn[now],dfn[now]+siz[now]-1);
            update(dfn[now],dfn[now]+siz[now]-1);
        }
        else
        {
//          puts("now wzy");
            update(1,dfn[x]-1);update(dfn[x]+siz[x],n);
        }
    }
    for(R int i=n;i;--i) if(!dfnn[i]) Tarjan(i);
    if(flag)
    for(R int i=1;i<=n;++i) puts("0");
//  for(R int i=1;i<=n;++i) printf("%d\n",qury(1))
    else 
    for(R int i=1;i<=n;++i) printf("%d\n",qury(dfn[i])==m);
//  fclose(stdin);
//  fclose(stdout);
    return 0;
}

HEOI 2019 RP++

转载于:https://www.cnblogs.com/LovToLZX/p/10612520.html

Matlab基于粒子群优化算法及鲁棒MPPT控制器提高光伏并网的效率内容概要:本文围绕Matlab在电力系统优化与控制领域的应用展开,重点介绍了基于粒子群优化算法(PSO)和鲁棒MPPT控制器提升光伏并网效率的技术方案。通过Matlab代码实现,结合智能优化算法与先进控制策略,对光伏发电系统的最大功率点跟踪进行优化,有效提高了系统在不同光照条件下的能量转换效率和并网稳定性。同时,文档还涵盖了多种电力系统应用场景,如微电网调度、储能配置、鲁棒控制等,展示了Matlab在科研复现与工程仿真中的强大能力。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的高校研究生、科研人员及从事新能源系统开发的工程师;尤其适合关注光伏并网技术、智能优化算法应用与MPPT控制策略研究的专业人士。; 使用场景及目标:①利用粒子群算法优化光伏系统MPPT控制器参数,提升动态响应速度与稳态精度;②研究鲁棒控制策略在光伏并网系统中的抗干扰能力;③复现已发表的高水平论文(如EI、SCI)中的仿真案例,支撑科研项目与学术写作。; 阅读建议:建议结合文中提供的Matlab代码与Simulink模型进行实践操作,重点关注算法实现细节与系统参数设置,同时参考链接中的完整资源下载以获取更多复现实例,加深对优化算法与控制系统设计的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值