【】2019年9月17日に

yybフィボナッチ自然

  1. \(GCD(F [I]、F [I + 1])= 1 \)

    証明します

    \(GCD(\ [I])[I + 1] F F)
    \(= GCD([I + 1] -f F [i]は、[I])F \)
    \(= GCD(F [I -1]、F [I])\)
    \(= ... \)
    \(= GCD(F [1]、F [2])= 1)\)

  2. \([M + N] = F [M-1] [n]は+ F F F [M + N] = F [M-1] F [N] + F [M] F [N + 1] F M] F [N + 1] \)

  3. \(GCD(F [N]([N + M]、F [N])= GCD F [N + M]、F [N])= GCD([N] F、F [M])GCD(F 、F [M])\)
    由上面式子得到
    \(GCD([N + M] = F F [M-1] [n]は+ F [M] F、F [N + 1]、F [N] )GCD([N + M] = F [M-1] F [N] + F [M] F [N + 1]、F [N])\)F
    \(= GCD(F [N + 1] F [M]、F [N])= GCD(F [N + 1] F [M]、F [N])\)
    \(= GCD(F [N + 1]、F [N])* GCD ([M] F、F [N])= GCD(F [N + 1]、F [N])* GCD([M] F、F [N])\)
    \(= 1×GCD([F M]、F [N])= 1 * GCD(F [M]、F [N])\)
    \(= GCD(F [M]、F [N])\)

  4. \(GCD([N] F F、[N + M])をF [GCD(N、N + M)] F [N] F GCD([N + M])= F [GCD(N、Nを= M + 1)] \)
    実証
    \(GCD(F [N-]、F [N- + M])GCD(F [N-]、F [N- + M])\)
    \(= GCD(F [N-]、Fを[N- + M]%F [M])GCD(F [N-]、F [N- + M]%F [M])\)=
    \(= GCD(F [N-]、F [m]が)GCDを= (F [N-]、F [M])\)
    \(= GCD(Fは[N-]、F [(N + M)%N-])GCD(F [N-]、F [(N + M)%= N-])\)
    分割の形で除去される
    ため、最後の
    \(GCD(F [N-]、F [N-M +])GCD(F [N-]、F [N-Mの+])\)
    \( = GCDは、(F [0]、F [GCD(N、N- + M)])GCD(F [0]、F [GCD(N、N- + M)])\)=
    \(= F [GCD(N-を、N + M)] \)

グラフ理論の基礎

(いくつかは、今知っているが、あまり明確な(?)又は決定します

単純なパス:単純なパスは、各エッジは、パスのみを介してです。
単純なループ:図の点列は、同じ開始点と終了点に加えて、ループの残りの部分は、頂点を省略する。
図の通信:任意の2つのノードを例に何ら通信は、通信と呼ばれていない場合。
強力な通信:通信手段は、任意の2つの通信ノードを、国を強化します。
弱い通信:図は、弱い通信手段を方向付け、非エッジを交換するすべての側面図を通信しています。
接続性:ドットのサイズを通信は、図カットセットの最小スポットサイズに等しいです。
エッジ接続:エッジ接続図エッジカットサイズの大きさが最小セットに等しいです。
ポイントカットセット:図のセット\(G = <V、E> \) 存在する場合\(V '\サブセットVの\ ) と\(V' \ません= \ Oslash \) そう\(P(G-V ')> P(G)\) および任意のための\(V「\サブセットV' \) されている\(P(G-V ')= P(G)\)と呼ばれる\(V' \)である\(G \)セットポイントカット。特に、場合\(V 'は\)である\(G \)ポイントカットが設定され、\は(V' \)単位集合、すなわちである\(V ' = \ {V \} \)と呼ばれる\(V \)のカット点について

(\ (P(G)\)図表す\(G \)通信分岐の数(通信ブロック))

エッジカットセット:図のセット\(G = <V、E> \)、\ (E '\サブセットE \)\(E' \ません= \ Oslash \) そう\(PS(G-E ' ) > P(G)\) および任意のための\(E '' \サブセットE '\)されている' = P(G)\)\(P(G-E ')と呼ばれる、\(E' \)される(G \)\)エッジカットセット(または単にカットセット。特に、場合\(E 'が\)される(G \)\サイドカットセット、および\(E'は\)単位のセット、すなわち、である\(E「= \ {E \} \)と呼ばれる、(\ E \)がブリッジ。

(\ (P(G)\)分岐を通信(通信部)グラフGの数を表します。)

部分グラフ:図のエッジ及びそのサブセットのノードのサブセットを選択します。

部分グラフ:サブグラフのノードと同じ画像を選択します。
サブグラフ:ノードのサブセットを選択し、その後縁図ノード関連設定のセットを選択します。
片側のサブセットを選択し、これらの側面、図1の構成に関連付けられたノードのセットを選択:誘起サブグラフエッジ。
図通信全く:(接続されたサブグラフ)サブグラフありません。
通信コンポーネント:(図面のない優れた接続部分グラフ)。
注:任意のノードやエッジを追加するための素晴らしい手段の後、もはや満足しています。

ツリーベース

バイナリツリーのルート(根とバイナリ木):バイナリツリー根ざした木のほとんどの2人の息子の各ノード(子ノード)に言及しました。多くの場合、子ノードは、左と右の子ノードと呼ばれ、2つのつの子ノードとを区別するため。
ほとんどの場合、この用語は、バイナリツリーを参照するバイナリツリーを根ざしています。
完全二分木(適切な/完全二分木):各ノードの子ノードの数は、0バイナリまたは2です。換言すれば、各ノードまたはリーフ、又は左右のサブツリーが空ではありません。
完全二分木(完全二分木):底部のみ2つのノードは2度未満であってもよく、ノードの底部層は、左端の層上の連続した位置に集中しています。
パーフェクトバイナリツリー(完璧なバイナリツリー):すべてのリーフノードの深さは完璧なバイナリツリーと呼ばれる同じバイナリツリーです。

予約限定:最初のrootアクセスは、その後、子ノードにアクセスします。
予約限定:最初の右のサブツリーを訪問し、その後、根を訪問し、その後、左のサブツリーをご覧ください。
後順:最初の子ノードへのアクセスは、その後、ルートにアクセスします。
INORDERトラバーサルは知られており、さらに第三のを要求することができます。

木の重心

定義:ツリーが重力のルートである場合、すべてのサブツリー(全体ではなく、ツリー自体)のサイズは、ツリー全体の半分のサイズを超えません。
そのサブツリーの全てに少なくとも最大のサブツリーノード、ポイントを検索し、この時点では重心の木です。
可能な限りバランスとして重心を削除した後、より木を生成します。

自然:

  1. 距離と点の全ての点のツリー、および重力の中心までの距離が最小である; 2つの重心、それらの距離と同じである場合。
  2. 2つのツリーが新しいツリーは、ツリーのツリーの重力の元の2つの新しい中心の重心を結ぶ、パスを与えるために、エッジによって接続されています。
  3. 片側だけの距離まで移動するには、その重心、その後、ツリーのリーフを追加または削除
  4. 木の重心は、せいぜい2、および隣接しています。

探している:
探索木の焦点は二回、簡単なことによって決定することができます。

  1. 各ノードをルートとするサブツリー内の最初のパスの探索ノードの数を取得する(sz_u \)\
  2. 検索は、第二の通過検索すること(MAX_ {息子におけるV \ \を (U)} \ {N-sz_u、sz_v \} \) 最小ノード
int ans,siz=inf;
void dfs(int u,int fa){
    sz[u]=1;
    int res=0;
    for(int i=head[u],v;i;i=e[i].nxt){
        if((v=e[i].v)==fa) continue;
        dfs(v,u),sz[u]+=sz[v];
        res=max(res,son[v]);
    }
    res=max(res,n-sz[u]);
    if(res<siz) ans=u,siz=res;
}

澱粉点線ルール

先輩:

処理ツリーのための一般的なデンプンルーティング問題
自然デンプンはツリー全体の重心を分割することです
その後、ファック

互いに独立サブツリーの各々 、ツリー全体を分離するために、現在のパーティションとして中心点を選択し、サブツリーを再帰的にすべての点は、パーティションツリーを構成する、分割行う
理由重心?
パーティションの問題の規模を考慮するとき、あなたは可能な限り小さく、問題のサブスケールを作るために重心を選択した場合のみ、各サブツリーサイズの重心は、つまり、nは少なくとも半分の各再帰的な問題のサイズの縮小、唯一の再帰的なログを/ 2を超えることはありません層

inline void findrt(int x,int fa){//找重心
    siz[x]=1; bst[x]=0;
    for(rg int i=hd[x];i!=-1;i=e[i].nt){
        int v=e[i].v; if(v == fa || vis[v]) continue;
        findrt(v,x); siz[x]+=siz[v];
        bst[x]=max(bst[x],siz[v]);
    }
    bst[x]=max(bst[x],S-siz[x]);
    if(bst[x] < bst[rt] || rt == 0) rt=x;
}

あなたが行う方法を、重心を見つけることがあると?

暴力ああ

重心とパーティション範囲の電流経路に電流がすべての統計考慮した後\((U、V)\ ) とみなすことができる\((U、S)+
(S、V)\) 統計長kに被験体に経路我々は、グローバルアレイに統計をハード両面を列挙し、次に分割し、征服、パスのためにそうすることを継続することができ、それだけ、それが分割の最高点を通過するときにカウントされ、征服され、O(N ^ 2)

いくつかのもののような統計は、統計いけませんか?

これは、法律上の同じ木から2つのパスにカウントしませんが、
この木を失うことは、各パーティションのサブツリー前の考慮事項も、場合にはO(n ^ 2)正当ではありません

高齢者がプレイシャイニングテンプレートコード

#include<bits/stdc++.h>
#define Max(x,y) ((x)>(y)?(x):(y))
using namespace std;

const int N=1e4+5;
int k[10000005];
int n,m,dis[N],vis[N],rt,sz[N],bst[N],S,tt,q[N];
template <class t>void rd(t &x){
    x=0;int w=0;char ch=0;
    while(!isdigit(ch)) w|=ch=='-',ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    x=w?-x:x;
}

int tot,head[N];
struct edge{int v,w,nxt;}e[N<<1];
inline void add(int u,int v,int w){
    e[++tot]=(edge){v,w,head[u]},head[u]=tot;
}

inline void findrt(int u,int fa){
    sz[u]=1,bst[u]=0;
    for(int i=head[u],v;i;i=e[i].nxt){
        if(vis[v=e[i].v]||v==fa) continue;
        findrt(v,u),sz[u]+=sz[v];
        bst[u]=Max(bst[u],sz[v]);
    }
    bst[u]=Max(bst[u],S-sz[u]);
    if(bst[u]<bst[rt]||!rt) rt=u;
}
inline void getdis(int u,int fa){
    q[++tt]=dis[u];
    for(int i=head[u],v;i;i=e[i].nxt){
        if(vis[v=e[i].v]||v==fa) continue;
        dis[v]=dis[u]+e[i].w,getdis(v,u);
    }
}

inline void deal(int u,int la,int fl){
    dis[u]=la,tt=0,getdis(u,0);
    for(int i=1;i<=tt;++i)
        for(int j=1;j<=tt;++j)
            k[q[i]+q[j]]+=fl;
}

inline void getans(int u){
    vis[u]=1,deal(u,0,1);
    for(int i=head[u],v;i;i=e[i].nxt){
        if(vis[v=e[i].v]) continue;
        deal(v,e[i].w,-1);
        rt=0,S=sz[v],findrt(v,u);
        getans(rt);
    }
}

int main(){
    freopen("in.txt","r",stdin);
    rd(n),rd(m);
    for(int i=1,u,v,w;i<n;++i) rd(u),rd(v),rd(w),add(u,v,w),add(v,u,w);
    S=n,findrt(1,0);
    getans(rt);
    for(int i=1,x;i<=m;++i){
        rd(x);
        if(k[x]>0) puts("AYE");
        else puts("NAY");
    }
    return 0;
}

クラスカル

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2e5+5,M=5e5+5,inf=0x3f3f3f3f;
int n,m;
ll ans=0;
template<class t>void rd(t &x){
    x=0;int w=0;char ch=0;
    while(!isdigit(ch)) w|=ch=='-',ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    x=w?-x:x;
}
struct edge{
    int u,v,w;
    bool operator<(const edge&X)const{return w<X.w;}
}e[M];
int f[N];
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
void kruskal(){
    for(int i=1;i<=n;++i) f[i]=i;
    for(int i=1,u,v;i<=m;++i)
        if(find(u=e[i].u)!=find(v=e[i].v)) f[f[u]]=f[v],ans+=e[i].w;
}

int main(){
    rd(n),rd(m);
    for(int i=1,u,v,w;i<=m;++i) rd(u),rd(v),rd(w),e[i]=(edge){u,v,w};
    sort(e+1,e+m+1);
    kruskal();
    printf("%lld",ans);
    return 0;
}

堅苦しい

#include<bits/stdc++.h>
using namespace std;
#define ll long long
typedef pair<int,int>pii;
priority_queue<pii,vector<pii>,greater<pii> >q;
const int N=2e5+5,M=5e5+5,inf=0x3f3f3f3f;
int n,m;
ll ans=0;
template<class t>void rd(t &x){
    x=0;int w=0;char ch=0;
    while(!isdigit(ch)) w|=ch=='-',ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    x=w?-x:x;
}

int head[N],tot=0;
struct edge{int v,w,nxt;}e[M<<1];
void add(int u,int v,int w){
    e[++tot]=(edge){v,w,head[u]},head[u]=tot;
}

int dis[N],vis[N];
void prim(){
    memset(vis,0,sizeof(vis));
    memset(dis,inf,sizeof(dis));
    q.push(make_pair(dis[1]=0,1));
    while(!q.empty()){
        int u=q.top().second;q.pop();
        if(vis[u]) continue;
        ans+=dis[u],vis[u]=1;
        for(int i=head[u],v,w;i;i=e[i].nxt)
        if(!vis[v=e[i].v]&&dis[v]>(w=e[i].w))
        dis[v]=w,q.push(make_pair(dis[v],v));
    }
}

int main(){
    rd(n),rd(m);
    for(int i=1,u,v,w;i<=m;++i) rd(u),rd(v),rd(w),add(u,v,w),add(v,u,w);
    prim();
    printf("%lld",ans);
    return 0;
}

おすすめ

転載: www.cnblogs.com/lxyyyy/p/11537503.html