1. 程式人生 > >NOIP考綱 圖論

NOIP考綱 圖論

function lca(a,b:longint):longint;
var
        i,j:longint;
begin
        if deep[a]<depp[b] then swap(a,b);
        i:=0;
        while (1<<i)<=deep[a] do inc(i);
        dec(i);
        for j:=i downto 0 do
        if deep[a]-(1<<j)>=deep[b] then a:=f[a,j];
        if a=b then exit
(a); for j:=i downto 0 do if (f[a,j]<>-1)and(f[a,j]<>f[b,j]) then begin a:=f[a,j]; b:=f[b,j]; end; exit(f[a,0]); end;

tarjan求lca

procedure tarjan(x:longint);
var
        i,v:longint;
begin
        vis[x]:=1;
        fa[x]:=x;
        i:=head1[x];
        while
i<>0 do//第一個鄰接表儲存詢問 begin v:=go1[i]; if vis[v] then ans[id[i]]:=find(v); i:=next1[i]; end; i:=head[x];//第二個鄰接表儲存圖 while i<>0 do begin v:=go[i]; if not vis[v] then
begin dis[v]:=dis[x]+len[i]; tarjan(v); fa[v]:=x; end; i:=next[i]; end; end;

3.最小(大)生成樹
kruskal

var f:array[1..1001] of longint;
    a:array[0..500001,1..3] of longint;
    i,j,k,n,m,x,y,c:longint;
    s:int64;
procedure qsort(l,r:longint);
    var x,y,m:longint;
    begin
        x:=l;
        y:=r;
        m:=a[(l+r) div 2,3];
        repeat
            while a[x,3]<m do inc(x);
            while a[y,3]>m do dec(y);
            if x<=y then
            begin
                a[0]:=a[x];
                a[x]:=a[y];
                a[y]:=a[0];
                inc(x);dec(y);
            end;
        until x>y;
        if l<y then qsort(l,y);
        if r>x then qsort(x,r);
    end;
function fu(z:longint):longint;
    var x,y:longint;
    begin
        y:=z;
        while y<>f[y] do y:=f[y];

        while z<>y do
        begin
            x:=f[z];
            f[z]:=y;
            z:=x;
        end;
    exit(y);
    end;
begin
    readln(n,m);
    for i:=1 to m do
    begin
        readln(x,y,c);
        a[i,1]:=x;
        a[i,2]:=y;
        a[i,3]:=c;
    end;
    qsort(1,m);

    for i:=1 to n do f[i]:=i;

    s:=0;
    for i:=1 to m do
    begin
        j:=fu(a[i,1]);
        k:=fu(a[i,2]);
        if j<>k then
        begin
            s:=s+a[i,3];
            f[j]:=k;
        end;
    end;
    writeln(s);
end.

比較簡單,常用
4.二分圖匹配(匈牙利)(判斷二分圖在最上面的那個網址,當然自己隨手打個染色也是可以的。)

bool dfs(int u){
    for(int i = head[u]; i != 0; i = e[i].nex){
        int v = e[i].v;
        if(!vis[v]){
            vis[v] = true;
            if(link[v] == -1 || dfs(link[v])){
                link[v] = u;
                return true;
            }
        }
    }
    return false;
}

5.最短路
自行百度。(我覺得不會考dij+heap)

相關推薦

NOIP

function lca(a,b:longint):longint; var i,j:longint; begin if deep[a]<depp[b] t

NOIP總結+NOIP考前經驗談

提前 測試 pau 也會 過去 分支 保險 ++ urn NOIP考綱總結+NOIP考前經驗談 首先來一張圖,很直觀(截止到2012年數據) 下面是收集的一些,我改了一下 紅色加粗表示特別重要,必須掌握 綠色加粗表示最好掌握,可能性不是很大,但是某些可以提高程序

noip提高組模板

//拓撲排序 void Top(){ for(i=1;i<=n;++i) if(!du[i]) q.push(i); while(!q.empty()){ int u=q.front();q.pop(); ans[++num]=u; for(int i=head[u];i;

OI奇異錄 - NOIP

NOIP考綱 - OI奇異錄 據說NOIP沒有考綱……但是我見過的或者聽聞到的還是記一下,方便複習 持續更新!  ◌ 演算法 搜尋演算法 DFS/BFS 迭代加深搜尋 啟發式搜尋 A* 雙端搜尋 動態規劃

NOIP模板複習——

由於圖論中有些演算法的程式碼比較長,就只貼核心程式碼 最短路 floyd void floyd() { int i,j,k; for(k=1;k<=n;++k) for(i=1;i<=n;++i) for(j=1;j<=n;++j

{福利}NOIP總結+NOIP考前經驗談

1.比賽前一天晚上請準備好你的各種證件,事先查好去往考場的路線2.比賽之前請先調整你的螢幕解析度到你喜歡的大小3.比賽之前請把編譯器的字型調為你平時慣用的字型,尤其是注意這種字型中的逗號,點,1,l這種易混淆的字是不是區分明顯4.在不影響視野的情況下,請將字號儘可能調大,方便查錯5.請將題目通讀完以後,再開始

NOIp複習】演算法模板合集

最小生成樹 Kruskal //Kruskal struct edge{ int from,to,val; }e[maxn]; bool operator < (const

疫情延遲 NOIP模擬 二分答案

開始 clu http 傳播 解釋 using gis hide n) 題面在最下方。 首先最短路判斷一下有沒有輸出 -1 的情況。 然後把握答案可以二分求解的特點,那就很容易解決了。 令邊中最大的年代為 maxx 那麽就在[1,maxx]中進行二分求解,枚舉年代mid,跑

noip系列——】貨車運輸

ble 更新 www 回來 現在 可能 路徑 們的 啊啊啊 P1967 貨車運輸 唔快下課啦我先寫寫思路吧qwq 顯然對於每輛貨車經過的路徑中,邊權最小的邊越大,答案越優 ——>先求一個最大生成樹保證樹上的邊邊權值都盡可能大

NOIP複賽複習(十三)演算法鞏固與提高

一、圖的儲存   1、鄰接矩陣   假設有n個節點,建立一個n×n的矩陣,第i號節點能到達第j號節點就將[i][j]標記為1(有權值標記為權值),  樣例如下圖:   /*無向圖,無權值*/ i

NOIP複賽複習(五)程式對拍與模板

程式對拍 所謂“對拍”,顧名思義,就是讓兩者相互比對。所謂“兩者”,一是你要測試的程式,二是一個答案在該程式在一定範圍(時間/空間)內結果必定正確的程式(一般是用暴力求解的程式)。對拍一般需要造資料程式(data.exe),保證正確性的暴力對拍程式(test.exe)與測試程式(以moo.e

Noip前的大抱佛腳----

圖論 知識點 Tarjan相關 邊雙和點雙/割邊和割點 強連通分量:有向圖中任意兩個頂點都有相互到達的路徑的一個極大子圖 邊雙連通分量:一個子圖中刪去任意一條邊都不影響圖的連通性 點雙連通分量:一個子圖中刪去任意一個點都不影響圖的連通性 割邊:連線兩個邊雙的邊 割點:連線兩個點雙的點 程式碼如下:

】2018國慶三校聯D5T2

分析: 題意非常醜陋。。。簡化出來就一句話:每個點有選中、未選中兩種狀態,現在給出一些矛盾關係,要求加入儘可能少的矛盾關係,使得沒有合法方案。 如此2sat的模型,顯然需要2sat的連邊方式。。。然後直接列舉每個位置選、不選是否合法即可。若不選合法,則考慮其練的邊是否有一個

NOIP 提高組 2014 聯合權值(???)

傳送門 https://www.cnblogs.com/violet-acmer/p/9937201.html   題解:   相關變數解釋: int n; int fa[maxn];//fa[i] : i的父親節點 int w[maxn];//w[i] : i的權值 long lo

】【DFS】三校聯10.20T2

題意 尋找有多少條邊滿足:圖中所有奇環都包含這條邊,且這條邊不屬於任何偶環 分析: 最後一個性質好坑。。。一直在想那個性質結果T3都沒來得及做… 直接建一個DFS樹。因為是無向圖,所以只存在樹邊和返祖

2018.11.01 NOIP訓練 (線段樹+倍增+dfs序)

傳送門 一道挺妙的題。 對於詢問點(u,v),如右圖所示,我們可以發現存在一個點m在u->v的路徑中,m子樹的點到u是最近的,m子樹外到v是最近的。其中dis(u,m)=(dis(u,v)-1)/2,且deep[u]>deep[v] 根據這個結論

NOIP 資訊學 奧賽 考點 模板 裸題 水題

//洛谷 P3372 【模板】線段樹 1//調了會,樣例通過,提交AC 2018-5-8 收穫是 對 線段樹 理解更深刻了 #include <stdio.h>#include <string.h>#define maxn 100100#define LL long longLL n,

】Car的旅行線路 NOIP 2001

【NOIP2001】Car的旅行線路 題目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅遊。 她知道每個城市都有四個飛機場,分別位於一個矩形的四個頂點上,同一個城市中兩個機場之間有一條筆直的高速鐵路,第I個城市中高速鐵路了的單位里程價格為Ti,任意兩個不同

noip 總結

noip的 圖論是套路最深的,,也是碼力最強的(一碼不慎,全盤皆輸) 所以對於圖論有一些比較基礎的技巧必須要熟練掌握(何為熟練?就是看到類似的問題很快出方法) 分題說一下難點: car: 碼力,以及對時間複雜度的分析 最優貿易:對雙向與單向的處理(分開用兩次spfa) 文

NOIP模擬題 2016.9.24 [貪心] [有依賴的揹包問題] [] [spfa或tarjan縮點+DAGdp]

1.排座椅 (seat.pas/c/cpp) 【問題描述】 上課的時候總有一些同學和前後左右的人交頭接耳,這是令小學班主任十分頭疼的一件事情。不過,班主任小雪發現了一些有趣的現象,當同學們的座次確定下來之後,只有有限的D對同學上課時會交頭接耳。同學們在教室