【】하려면 2019년 9월 17일

YYB 피보나치 자연

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

    증명

    \ (GCD ([I], F [i가 + 1]) \ F)
    \ (= GCD (F [내가 + 1] -f [I], F [I]) \)
    \ (= GCD (F [I -1], F [I]) \)
    \ (= ... \)
    \ (= GCD (F [1], F [2]) = 1) \)

  2. \ (F [M + N] = F [m-1] [N] + F [m] F [N + 1] F [M + N] = F [m-1] F [N] + F의 [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 = GCD (F [N + 1], F [N]) * GCD (F [m], F [N]) \ () [m], F [N] F)
    \ (= 1 * GCD 수 (F- [ m], F [N]) = 1 * GCD (F [m], F [N]) \)
    \ (= GCD (F [m], F [N]) \)

  4. F \ (GCD ([N] , [N + m]가) f를 F [GCD (N, N + m)] GCD를 (F = [N], F [N + m) = N F [GCD (N ) m을 +] \)
    증명
    \ (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)] \)

그래프 이론의 기초

(일부는 지금 알고 있지만 명확하지 (?) 또는 결정

간단한 경로 : 간단한 경로, 각 가장자리에만 경로를 통해입니다.
간단한 루프 :도 포인트 순서는, 같은 시작과 끝 지점에 추가로, 루프의 나머지 정점을 반복하지 않는다.
도 통신 : 통신이 임의의 두 노드를 상기도하지 할 경우 통신라고합니다.
강력한 통신 : 통신 수단은 두 통신 노드를 국가를 강화한다.
약한 통신 :도 사방이 아닌 에지가도 통신 대체 약한 통신 수단을 지시했다.
연결성 : 도트의 크기를 통신도 절단 세트의 최소 스폿 사이즈와 동일하다.
에지 연결성 에지 연결도 에지 컷 사이즈의 크기는 최소한 동일하다.
포인트 컷 세트 :도 설정 \ (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-E' ') = P (G) \) 라고 \ (E' \) 이다 \ (G \) 에지 세트 컷 (또는 단순히 절단 세트). 특히, 만약 \ (E '는 \) 된다 (G \) \ 사이드 컷 세트 및 (\ \ E)은 " 유닛 세트, 즉,이다 \ (E'= \ {E \} \) 라는, \는 ( E \)는 브리지.

(\는 (P (G)는 \) 통신 지점들의 수를 나타낸다 (통신 블록) 그래프 G)

서브 그래프 :도 에지 및 그 서브 세트의 노드의 서브 세트를 선택하는 단계를 포함한다.

서브 그래프 : 서브 그래프 노드와 같은 사진을 선택합니다.
이 서브 그래프의 노드의 서브 세트를 선택하고 구성도 연관된 에지 노드의 세트를 선택한다.
한쪽의 서브 세트를 선택하고, 이러한면,도 10의 구성으로 연결된 노드의 세트를 선택 유도 에지 서브 그래프.
도 연통 없음 :( 연결된 서브 그래프) 서브 그래프 없다.
통신 컴포넌트 :( 도면없이 큰 연결된 서브 그래프).
주 : 좋은 수단이 어떤 노드를 추가하지 않습니다 또는 가장자리가 더 이상 만족 한 후.

트리 기반

이진 트리 루트 (뿌리 이진 트리) : 이진 나무 뿌리 트리의 가장 두 아들 (자식 노드)의 각 노드에 언급했다. 종종 두 개의 자식 노드 사이를 구별하기 위해, 자식 노드로 왼쪽과 오른쪽 자식 노드라고합니다.
대부분의 경우,이 용어는 이진 트리 이진 트리를 뿌리 의미합니다.
완전 이진 트리 (적절한 / 완전 이진 트리) : 각 노드의 자식 노드의 수는 0 또는 2 진입니다. 즉, 각 노드 또는 잎, 또는 왼쪽과 오른쪽 서브 트리가 비어 있지 않은.
완전 이진 트리 (이진 트리를 완성) 만 아래 두 개의 노드는 2도 이하로 할 수 있으며, 노드의 맨 아래 층 맨 왼쪽 레이어의 연속적인 위치에 집중되어있다.
완벽한 이진 트리 (완전 이진 트리) : 모든 잎 노드의 깊이는 완벽한 이진 트리라는 같은 이진 트리입니다.

예약 주문 : 첫 번째 루트 액세스는, 다음 자식 노드에 액세스 할 수 있습니다.
예약 주문 : 먼저, 다음 루트를 방문, 왼쪽 서브 트리를 방문하여 적절한 서브 트리를 방문하십시오.
Postorder : 첫 번째 자식 노드 액세스은 다음 루트에 액세스 할 수 있습니다.
공지 순회 중위 및 상기 제를 요청할 수있다.

나무의 무게 중심

정의 : 나무 중력의 루트 인 경우, 모든 하위 트리의 크기 (전체 트리 자체가되지 않음) 트리 전체의 절반 크기를 초과하지 않습니다.
지점 찾기, 가장 큰 하위 트리 적어도 노드 하위 트리의 모든,이 점은 무게 중심의 나무입니다.
가능한 균형으로 무게 중심을 삭제 한 후 더 많은 나무를 생산합니다.

자연 :

  1. 거리 및 점들의 모든 점과 무게 중심까지의 거리에 트리 최소한 2 개 개의 무게 중심의 거리와 동일한 경우가있다.
  2. 두 나무가 새로운 트리 트리에서 트리의 무게 원래 두 개의 새로운 중심의 중심을 연결 한 후 경로를 제공하기 위해 에지에 의해 연결된다.
  3. 추가 또는 나무의 잎을 삭제 한 후 무게 중심이 한쪽의 거리까지 이동 만
  4. 나무의 무게 중심은 최대 두 인접있다.

원하는 상대 :
검색 트리의 초점은 두 번 간단한에 의해 결정될 수있다.

  1. 각 노드를 루트로하는 서브 트리의 제 1 패스 검색 노드의 수를 얻기 (sz_u \) \
  2. 검색은 제 2 패스 찾는 것을 (MAX_ {아들 브이 \ \을 (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) 수

몇 가지해야하지 통계와 같은 통계?

이 같은 나무에서 두 가지 경로를 계산합니다,하지만 법적
고려 사항이 나무를 잃는 각 파티션의 하위 트리에 앞서이 경우 합법적 아니라, 또한 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