NOIP考纲 图论

来源:互联网 发布:不喝牛奶 知乎 编辑:程序博客网 时间:2024/04/30 04:04

从今天开始复习NOIP的考纲,每天复习一些,内容包括板子之类的。
DAY1 图论
1.Tarjan
http://blog.csdn.net/qq_35866453/article/details/52589539
2.LCA
倍增LCA:

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)

0 0
原创粉丝点击