国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

三、搜索與圖論

這篇具有很好參考價值的文章主要介紹了三、搜索與圖論。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

DFS

排列數(shù)字

三、搜索與圖論,算法基礎(chǔ)課,圖論,深度優(yōu)先,算法

#include<iostream>
using namespace std;
const int N = 10;
int a[N], b[N];
int n;

void dfs(int u){
    if(u > n){
        for(int i = 1; i <= n; i++)
            cout<<a[i]<<" ";
        cout<<endl;
        return;
    }
    for(int i = 1; i <= n; i++){
        if(!b[i]){
            b[i] = 1;
            a[u] = i;
            dfs(u + 1);
            b[i] = 0;
        }
    }
}

int main(){
    cin>>n;
    dfs(1);
    return 0;
}

n-皇后問題

三、搜索與圖論,算法基礎(chǔ)課,圖論,深度優(yōu)先,算法

#include<iostream>
using namespace std;
const int N = 20;
char g[N][N];
int a[N], b[N], c[N];
int n;

void dfs(int u){
    if(u > n){
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= n; j++)
                cout<<g[i][j];
            cout<<endl;
        }
        cout<<endl;
        return;
    }
    for(int i = 1; i <= n; i++){
        if(!a[i] && !b[u + i] && !c[-u + i + n]){
            a[i] = b[u + i] = c[-u + i + n] = 1;
            g[u][i] = 'Q';
            dfs(u + 1);
            g[u][i] = '.';
            a[i] = b[u + i] = c[-u + i + n] = 0;
        }
    }
}

int main(){
    cin>>n;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            g[i][j] = '.';
    dfs(1);
    return 0;
}

BFS

走迷宮

三、搜索與圖論,算法基礎(chǔ)課,圖論,深度優(yōu)先,算法

#include<iostream>
#include<cstring>
using namespace std;
const int N = 110;
int g[N][N], d[N][N];
pair<int, int> q[N * N];
int hh, tt = - 1;
int n, m;

int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};

void bfs(int x, int y){
    memset(d, -1, sizeof(d));
    q[++tt] = make_pair(x, y);
    d[x][y] = 0;
    while(hh <= tt){
        auto t = q[hh++];
        for(int i = 0; i < 4; i++){
            int a = dx[i] + t.first, b = dy[i] + t.second;
            if(a < 1 || a > n || b < 1 || b > m) continue;
            if(d[a][b] != -1) continue;
            if(g[a][b] != 0) continue;
            d[a][b] = d[t.first][t.second] + 1;
            q[++tt] = make_pair(a, b);
        }
    }
    cout<<d[n][m];
}

int main(){
    cin>>n>>m;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            cin>>g[i][j];
    bfs(1, 1);
    return 0;
} 

八數(shù)碼

三、搜索與圖論,算法基礎(chǔ)課,圖論,深度優(yōu)先,算法
三、搜索與圖論,算法基礎(chǔ)課,圖論,深度優(yōu)先,算法

#include<iostream>
#include<unordered_map>
using namespace std;
const int N = 1e6; //一共有9!種情況
unordered_map<string, int> d;
string q[N];
int hh, tt = -1;
int n = 9;

int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};

int bfs(string s){
    q[++tt] = s;
    d[s] = 0;
    //記錄終點
    string end = "12345678x";
    while(hh <= tt){
        string t = q[hh++];
        //存儲當前位置到起點的距離
        int dis = d[t];
        //如果到終點了,那就返回距起點距離
        if(t == end) return dis;
        //查找x的下標
        int k = t.find('x');
        //x在矩陣中的位置
        int x = k / 3, y = k % 3;
        for(int i = 0; i < 4; i++){
            int a = x + dx[i], b = y + dy[i];
            if(a < 0 || a > 2 || b < 0 || b > 2) continue;
            //轉(zhuǎn)移x
            swap(t[k], t[3 * a + b]);
            //如果沒有遍歷過,那就存儲到隊列中
            if(!d.count(t)){
                d[t] = dis + 1;
                q[++tt] = t;
            }
            //還原
            swap(t[k], t[3 * a + b]);
        }
    }
    return -1;
}

int main(){
    char c;
    string s = "";
    for(int i = 0; i < n; i++){
        cin>>c;
        s += c;
    }
    cout<<bfs(s);
    return 0;
}

樹和圖的存儲

樹是一種特殊的圖
存儲可以用鏈式向前星或者vector

//鏈式向前星
#include<iostream>
#include<cstring>
using namespace std;
const int N = 1e5 + 10, M = 2 * N;
int h[N], e[N], ne[N], idx;
int st[N];

void add(int a, int b){
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx;
    idx++;
}

void dfs(int u){
    st[u] = 1;
    for(int i = u; i != -1; i = ne[i]){
        int j = e[i];
        if(!st[j]) dfs(j);
    }
}

int main(){
    memset(h, -1, sizeof(h));
    return 0;
}

//vector存儲
#include<iostream>
#include<vector>
using namespace std;
const int N = 1e5 + 10;
vector<int> v[N];
int st[N];

void add(int a, int b){
    v[a].push_back(b);
    v[b].push_back(a);
}

void dfs(int u){
    st[u] = 1;
    for(int i = 0; i < v[u].size(); i++){
        int j = v[u][i];
        if(!st[j]) dfs(j);
    }
}

int main(){
    return 0;
}

樹與圖的深度優(yōu)先遍歷

樹的重心

三、搜索與圖論,算法基礎(chǔ)課,圖論,深度優(yōu)先,算法
三、搜索與圖論,算法基礎(chǔ)課,圖論,深度優(yōu)先,算法

#include<iostream>
#include<cstring>
using namespace std;
const int N = 1e5 + 10, M = 2 * N;
int h[N], e[M], ne[M], idx;
int st[N];
int n, ans = 1e9;

void add(int a, int b){
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx;
    idx++;
}

int dfs(int u){
    st[u] = 1;
    //cnt存儲以u為根的節(jié)點數(shù)(包括u),res是刪除掉某個節(jié)點后的最大連通子圖節(jié)點數(shù)
    int cnt = 1, res = 0; 
    for(int i = h[u]; i != -1; i = ne[i]){
        int j = e[i];
        if(!st[j]){
            //以u為節(jié)點的單棵子樹的節(jié)點數(shù)
            int t = dfs(j);
            //計算以j為根的樹的節(jié)點數(shù)
            cnt += t;
            //記錄最大連通子圖節(jié)點數(shù)
            res = max(res, t);
        }
    }
    //以u為重心,最大的連通子圖節(jié)點數(shù)
    res = max(res, n - cnt);
    ans = min(ans, res);
    return cnt;
}

int main(){
    memset(h, -1, sizeof(h));
    cin>>n;
    int a, b;
    for(int i = 0; i < n - 1; i++){
        cin>>a>>b;
        add(a, b);
        add(b, a);
    }
    dfs(1);
    cout<<ans;
    return 0;
}

樹與圖的寬度優(yōu)先遍歷

圖中點的層次

三、搜索與圖論,算法基礎(chǔ)課,圖論,深度優(yōu)先,算法

#include<iostream>
#include<cstring>
using namespace std;
const int N = 1e5 + 10, M = 2 * N;
int h[N], e[M], ne[M], idx;
int q[N], d[N], hh, tt = -1;
int n, m;

void add(int a, int b){
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx;
    idx++;
}

void bfs(int u){
    memset(d, -1, sizeof(d));
    q[++tt] = u;
    d[u] = 0;
    while(hh <= tt){
        //使用隊頭,彈出隊頭
        int t = q[hh++];
        for(int i = h[t]; i != -1; i = ne[i]){
            int j = e[i];
            if(d[j] == -1){
                //更新距離
                d[j] = d[t] + 1;
                //入隊
                q[++tt] = j;
            }
        }
    }
    cout<<d[n];
}

int main(){
    memset(h, -1, sizeof(h));
    cin>>n>>m;
    int x, y;
    while(m--){
        cin>>x>>y;
        add(x, y);
    }
    bfs(1);
    return 0;
}

拓撲排序

有向無環(huán)圖也是拓撲圖
入度:有多少條邊指向自己
出度:有多少條邊出去

有向圖的拓撲序列

三、搜索與圖論,算法基礎(chǔ)課,圖論,深度優(yōu)先,算法
入度為0就是起點,出度為0就是終點

#include<iostream>
#include<cstring>
using namespace std;
const int N = 1e5 + 10;
int h[N], e[N], ne[N], idx;
int q[N], hh, tt = -1;
int n, m;
int r[N]; //存儲入度

void add(int a, int b){
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx;
    idx++;
}

void bfs(){
    //判斷哪些點入度為0
    for(int i = 1; i <= n; i++)
        if(!r[i]) q[++tt] = i;
    while(hh <= tt){
        int t = q[hh++];
        for(int i = h[t]; i != -1; i = ne[i]){
            int j = e[i];
            r[j]--;
            if(!r[j]) q[++tt] = j;
        }
    }
    if(tt == n - 1){
        for(int i = 0; i <= tt; i++) cout<<q[i]<<" ";
    }else cout<<-1;
}

int main(){
    memset(h, -1, sizeof(h));
    cin>>n>>m;
    int x, y;
    while(m--){
        cin>>x>>y;
        add(x, y);
        r[y]++;
    }
    bfs();
    return 0;
}

最短路

幫助理解
三、搜索與圖論,算法基礎(chǔ)課,圖論,深度優(yōu)先,算法

Dijkstra

Dijkstra求最短路 I

三、搜索與圖論,算法基礎(chǔ)課,圖論,深度優(yōu)先,算法

#include<iostream>
#include<cstring>
using namespace std;
const int N = 510;
int g[N][N], d[N], b[N];
int n, m;

void dijkstra(int u){
    memset(d, 0x3f, sizeof(d));
    d[u] = 0;
    for(int i = 0; i < n; i++){
        int t = -1;
        for(int j = 1; j <= n; j++)
            if(!b[j] && (t == -1 || d[t] > d[j])) t = j;
        b[t] = 1;
        for(int j = 1; j <= n; j++)
            d[j] = min(d[j], d[t] + g[t][j]);
    }
    cout<<((d[n] == 0x3f3f3f3f) ? -1 : d[n]);
}

int main(){
    memset(g, 0x3f, sizeof(g));
    cin>>n>>m;
    int x, y, z;
    while(m--){
        cin>>x>>y>>z;
        g[x][y] = min(g[x][y], z);
    }
    dijkstra(1);
    return 0;
}

Dijkstra求最短路 II

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N = 2e5;
int h[N], e[N], ne[N], w[N], idx; //w[i]存儲上個點到i的距離
int d[N], b[N];
int n, m;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q; //小根堆,第一個元素存儲距離,第二個元素存儲下標

void add(int x, int y, int z){
    e[idx] = y;
    w[idx] = z;
    ne[idx] = h[x];
    h[x] = idx;
    idx++;
}

void dijkstra(int u){
    memset(d, 0x3f, sizeof(d));
    d[u] = 0;
    q.push(make_pair(0, 1));
    while(q.size()){
        auto t = q.top();
        q.pop();
        int x = t.first, y = t.second;
        if(b[y]) continue; //如果遍歷過就退出
        b[y] = 1;
        for(int i = h[y]; i != -1; i = ne[i]){
            int j = e[i];
            if(d[j] > x + w[i]){
                d[j] = x + w[i];
                q.push(make_pair(d[j], j));
            }
        }
    }
    cout<<(d[n] == 0x3f3f3f3f ? -1 : d[n]);
}

int main(){
    memset(h, -1, sizeof(h));
    cin>>n>>m;
    int x, y, z;
    while(m--){
        cin>>x>>y>>z;
        add(x, y, z);
    }
    dijkstra(1);
    return 0;
}

增加點權(quán),求有多少條最短路

題目鏈接

#include<iostream>
#include<cstring>
using namespace std;
int g[505][505], dis[505], st[505];
int a[505], paths[505], teams[505];
int n, m, c1, c2;

void dj(int u){
    teams[u] = a[u];
    paths[u] = 1;
    dis[u] = 0;
    for(int j = 0; j < n; j++){
        int t = -1;
        for(int i = 0; i < n; i++){
            if(!st[i] && (t == -1 || dis[t] > dis[i])){
                t = i;
            }
        }
        st[t] = 1;
        for(int i = 0; i < n; i++){
            if(dis[i] > dis[t] + g[t][i]){
                dis[i] = dis[t] + g[t][i]; 
                paths[i] = paths[t]; //繼承路徑條數(shù)
                teams[i] = teams[t] + a[i]; //更新救援隊人數(shù)
            }else if(dis[i] == dis[t] + g[t][i]){
                if(teams[i] < teams[t] + a[i]){
                    teams[i] = teams[t] + a[i]; //選救援隊人數(shù)更多的
                } 
                paths[i] += paths[t]; //累加路徑條數(shù)
            }
        }
    }
}

int main(){
    memset(g, 0x3f, sizeof(g));
    cin>>n>>m>>c1>>c2;
    for(int i = 0; i < n; i++) cin>>a[i];
    while(m--){
        int x, y, z;
        cin>>x>>y>>z;
        g[x][y] = g[y][x] = min(g[x][y], z);
    }
    memset(dis, 0x3f, sizeof(dis));
    dj(c1);
    cout<<paths[c2]<<" "<<teams[c2];
    return 0;
}

增加邊權(quán),求花費最少

題目鏈接

#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
int g[505][505], dis[505], st[505];
int cost[505][505], c[505], pre[505];
vector<int> path;
int n, m, s, d;

void dj(int u){
    dis[u] = 0;
    c[u] = 0;
    for(int i = 0; i < n; i++){
        int t = -1;
        for(int j = 0; j < n; j++){
            if(!st[j] && (t == -1 || dis[t] > dis[j])){
                t = j;
            }
        }
        st[t] = 1;
        for(int j = 0; j < n; j++){
            if(dis[j] > dis[t] + g[t][j]){
            	pre[j] = t;
                dis[j] = dis[t] + g[t][j];
                c[j] = c[t] + cost[t][j];
            }else if(dis[j] == dis[t] + g[t][j] && c[j] > c[t] + cost[t][j]){
            	pre[j] = t;
                c[j] = c[t] + cost[t][j];
            }
        }
    }
}

int main(){
    memset(g, 0x3f, sizeof(g));
    memset(dis, 0x3f, sizeof(dis));
    memset(c, 0x3f, sizeof(c));
    memset(cost, 0x3f, sizeof(cost));
    cin>>n>>m>>s>>d;
    while(m--){
        int x, y, z, h;
        cin>>x>>y>>z>>h;
        g[x][y] = g[y][x] = min(g[x][y], z);
        cost[x][y] = cost[y][x] = min(cost[x][y], h);
    }
    for(int i = 0; i < n; i++) pre[i] = i;
    dj(s);
    int q = d;
    while(q != s){
    	path.push_back(q);
    	q = pre[q];
	}
	path.push_back(s);
	int p = path.size();
	for(int i = p - 1; i >= 0; i--) cout<<path[i]<<" ";
	cout<<dis[d]<<" "<<c[d];
    return 0;
}

bellman-ford

有邊數(shù)限制的最短路

如果負環(huán)在1到n的路徑上,那就不存在最短路

#include<iostream>
#include<cstring>
using namespace std;
const int N = 510, M = 1e4 + 10;
int d[N], b[N]; //b數(shù)組備份
int n, m, k;
struct E{
    int x, y, z;
}e[M];

void bellman_ford(int u){
    memset(d, 0x3f, sizeof(d));
    d[u] = 0;
    //最多k條邊
    for(int i = 0; i < k; i++){
        //每次只更新一條串聯(lián)路徑,防止更新了多條串聯(lián)路徑
        memcpy(b, d, sizeof(d));
        for(int j = 0; j < m; j++){
            int x = e[j].x, y = e[j].y, z = e[j].z;
            d[y] = min(d[y], b[x] + z);
        }
    }
    if(d[n] > 0x3f3f3f3f / 2) cout<<"impossible";
    else cout<<d[n];
}

int main(){
    cin>>n>>m>>k;
    int x, y, z;
    for(int i = 0; i < m; i++){
        cin>>x>>y>>z;
        e[i] = {x, y, z};
    }
    bellman_ford(1);
    return 0;
}

spfa

spfa求最短路

三、搜索與圖論,算法基礎(chǔ)課,圖論,深度優(yōu)先,算法
三、搜索與圖論,算法基礎(chǔ)課,圖論,深度優(yōu)先,算法

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N = 1e5 + 10;
int h[N], e[N], ne[N], w[N], idx;
int dis[N], st[N];
int q[N], hh, tt = -1;
int n, m;

void add(int x, int y, int z){
    e[idx] = y;
    w[idx] = z;
    ne[idx] = h[x];
    h[x] = idx;
    idx++;
}

void spfa(int u){
    memset(dis, 0x3f, sizeof(dis));
    dis[u] = 0;
    q[++tt] = u;
    st[u] = 1;
    while(hh <= tt){
        int t = q[hh++];
        //有環(huán),所以可能一個點會遍歷兩次
        st[t] = 0;
        for(int i = h[t]; i != -1; i = ne[i]){
            int j = e[i];
            if(dis[j] > dis[t] + w[i]){
                dis[j] = dis[t] + w[i];
                if(!st[j]){
                    q[++tt] = j;
                    st[j] = 1;
                }
            }
        }
    }
    if(dis[n] == 0x3f3f3f3f) cout<<"impossible";
    else cout<<dis[n];
}

int main(){
    memset(h, -1, sizeof(h));
    cin>>n>>m;
    int x, y, z;
    for(int i = 0; i < m; i++){
        cin>>x>>y>>z;
        add(x, y, z);
    }
    spfa(1);
    return 0;
}

spfa判斷負環(huán)

#include<iostream>
#include<cstring>
using namespace std;
const int N = 2e3 + 10, M = 1e4 + 10;;
int h[N], e[M], ne[M], w[M], idx;
int dis[N], st[N], cnt[N];
int q[N * N], hh, tt = -1; //有環(huán)的時候,一個元素可能會一直插入隊列,所以要開N * N
int n, m;

void add(int x, int y, int z){
    e[idx] = y;
    w[idx] = z;
    ne[idx] = h[x];
    h[x] = idx;
    idx++;
}

void spfa(){
    //存在的負權(quán)回路,不一定從1開始
    for(int i = 1; i <= n; i++){
        q[++tt] = i;
        st[i] = 1;
    }
    while(hh <= tt){
        int t = q[hh++];
        //有環(huán),所以可能一個點會遍歷兩次
        st[t] = 0;
        for(int i = h[t]; i != -1; i = ne[i]){
            int j = e[i];
            if(dis[j] > dis[t] + w[i]){
                dis[j] = dis[t] + w[i];
                cnt[j] = cnt[t] + 1;
                if(cnt[j] >= n){
                    cout<<"Yes";
                    return;
                }
                if(!st[j]){
                    q[++tt] = j;
                    st[j] = 1;
                }
            }
        }
    }
    cout<<"No";
}

int main(){
    memset(h, -1, sizeof(h));
    cin>>n>>m;
    int x, y, z;
    for(int i = 0; i < m; i++){
        cin>>x>>y>>z;
        add(x, y, z);
    }
    spfa();
    return 0;
}

Floyd

Floyd求最短路

f(k, i, j) = f(k - 1, i, k) + f(k - 1, k, j);

#include<iostream>
using namespace std;
const int N = 210;
int f[N][N];
int n, m, k;

void floyd(){
    for(int k = 1; k <= n; k++)
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= n; j++)
                f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
}

int main(){
    cin>>n>>m>>k;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            if(i == j) f[i][j] = 0;
            else f[i][j] = 0x3f3f3f3f;
    int x, y, z;
    for(int i = 1; i <= m; i++){
        cin>>x>>y>>z;
        f[x][y] = min(f[x][y], z);
    }
    floyd();
    for(int i = 1; i <= k; i++){
        cin>>x>>y;
        //可能存在負權(quán)邊
        if(f[x][y] > 0x3f3f3f3f / 2) cout<<"impossible"<<endl;
        else cout<<f[x][y]<<endl;
    }
    return 0;
}

最小生成樹

三、搜索與圖論,算法基礎(chǔ)課,圖論,深度優(yōu)先,算法

Prim

Kruskal

二分圖

三、搜索與圖論,算法基礎(chǔ)課,圖論,深度優(yōu)先,算法文章來源地址http://www.zghlxwxcb.cn/news/detail-830367.html

染色法判定二分圖

匈牙利算法

到了這里,關(guān)于三、搜索與圖論的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • ACWing算法基礎(chǔ)課

    ACWing算法基礎(chǔ)課

    y總說 java不能用Scanner讀入,要用Buffer.read();快十倍二十倍; y總19年5月的視頻,牛13! 包括排序、二分、高精度、前綴和與差分、雙指針算法、位運算、離散化、區(qū)間合并等內(nèi)容。 一定要先移動end(就是把大數(shù)移到右邊),后移動start; 否則 先找小數(shù),會出現(xiàn)end start重合位置

    2024年02月13日
    瀏覽(20)
  • 【算法基礎(chǔ):搜索與圖論】3.3 拓撲排序

    【算法基礎(chǔ):搜索與圖論】3.3 拓撲排序

    https://oi-wiki.org/graph/topo/ 本文主要學習拓撲排序相關(guān)知識。 拓撲排序的英文名是 Topological sorting。 拓撲排序要解決的問題是給一個 有向無環(huán)圖 的 所有節(jié)點排序 。 我們可以拿大學每學期排課的例子來描述這個過程,比如學習大學課程中有:程序設(shè)計,算法語言,高等數(shù)學,

    2024年02月16日
    瀏覽(26)
  • acwing算法基礎(chǔ)之搜索與圖論--kruskal算法

    kruskal算法的關(guān)鍵步驟為: 將所有邊按照權(quán)重從小到大排序。 定義集合S,表示生成樹。 枚舉每條邊(a,b,c),起點a,終點b,邊長c。如果結(jié)點a和結(jié)點b不連通(用并查集來維護),則將這條邊加入到集合S中。 kruskal算法的時間復雜度為O(mlogm),它用來解決稀疏圖的最小生成樹問題

    2024年02月05日
    瀏覽(26)
  • 算法基礎(chǔ)課第五講 動態(tài)規(guī)劃

    算法基礎(chǔ)課第五講 動態(tài)規(guī)劃

    時間復雜度:狀態(tài)數(shù)量 轉(zhuǎn)移的計算量 * 總體概述:給一堆物品,有體積有價值。有一個背包,在背包能裝下的前提下最終能裝下多少(背包不一定要裝滿) DP問題:一般需要從兩方面考慮:狀態(tài)表示以及狀態(tài)計算 狀態(tài)表示:f(i,j) 從兩個方面考慮:集合(所有選法的集合)(

    2024年02月01日
    瀏覽(18)
  • Acwing-基礎(chǔ)算法課筆記之搜索與圖論

    Acwing-基礎(chǔ)算法課筆記之搜索與圖論

    bellman-ford算法適用于負權(quán)邊的圖,求 1 到 n 的最多經(jīng)過k條邊的最短距離。 如圖所示: 1 2 3 dist 0 ∞ infty ∞ ∞ infty ∞ ? Downarrow ? 1 2 3 dist 0 1 ∞ infty ∞ ? Downarrow ? 1 2 3 dist 0 1 2 此過程中出現(xiàn)了串聯(lián)的結(jié)果,所以是錯誤的,此時需要進行備份操作。 備份操作如下: 為了

    2024年01月20日
    瀏覽(28)
  • 【算法基礎(chǔ):搜索與圖論】3.2 樹與圖的dfs和bfs

    【算法基礎(chǔ):搜索與圖論】3.2 樹與圖的dfs和bfs

    要學會建樹、建圖的通用方法。 dfs 和 bfs 的代碼框架。 https://www.acwing.com/problem/content/848/ 在 dfs 的過程中,統(tǒng)計各個節(jié)點作為斷點時的連通塊最大值。 https://www.acwing.com/problem/content/849/ 看到最短距離就可以想到使用寬搜。 注意! :題目中說明了 a 和 b 表示存在一條從 a 走到

    2024年02月16日
    瀏覽(21)
  • 【algorithm】算法基礎(chǔ)課---二分查找算法(附筆記 | 建議收藏)

    【algorithm】算法基礎(chǔ)課---二分查找算法(附筆記 | 建議收藏)

    ??write in front?? ??個人主頁:認真寫博客的夏目淺石. ??歡迎各位→點贊?? + 收藏?? + 留言?? ??系列專欄:AcWing算法學習筆記 ??總結(jié):希望你看完之后,能對你有所幫助,不足請指正!共同學習交流 ?? ?? 如果無聊的話,就來逛逛我的博客棧吧 stack-frame.cn 關(guān)于我

    2024年01月18日
    瀏覽(22)
  • 【AcWing算法基礎(chǔ)課】第五章 動態(tài)規(guī)劃(未完待續(xù))

    【AcWing算法基礎(chǔ)課】第五章 動態(tài)規(guī)劃(未完待續(xù))

    本專欄文章為本人AcWing算法基礎(chǔ)課的學習筆記,課程地址在這。如有侵權(quán),立即刪除。 dp問題的優(yōu)化 :在基本形式dp上作等價變形。 dp問題的解題方法 : 1)狀態(tài)表示 集合 屬性:最大值/最小值/數(shù)量。 2)狀態(tài)計算 集合劃分(不重不漏) 題目鏈接: 2. 01背包問題 - AcWing題庫

    2024年02月12日
    瀏覽(26)
  • 【AcWing算法基礎(chǔ)課】第二章 數(shù)據(jù)結(jié)構(gòu)(部分待更)

    【AcWing算法基礎(chǔ)課】第二章 數(shù)據(jù)結(jié)構(gòu)(部分待更)

    本專欄文章為本人AcWing算法基礎(chǔ)課的學習筆記,課程地址在這。如有侵權(quán),立即刪除。 鄰接表 :存儲圖和樹 e數(shù)組存儲每個結(jié)點的值,ne數(shù)組存儲每個結(jié)點的指向的下一個結(jié)點。 數(shù)組模擬鏈表比較快,指針模擬會涉及到new操作,比較慢。 題目鏈接 :826. 單鏈表 1.1題目描述

    2024年02月13日
    瀏覽(22)
  • 【算法基礎(chǔ):搜索與圖論】3.5 求最小生成樹算法(Prim&Kruskal)

    【算法基礎(chǔ):搜索與圖論】3.5 求最小生成樹算法(Prim&Kruskal)

    最小生成樹 有關(guān)樹的定義 生成子圖 :生成子圖是從原圖中選取部分節(jié)點以及這些節(jié)點之間的邊所組成的圖。生成子圖中的所有節(jié)點和邊都必須在原圖中存在。 生成樹 :一個連通 無向圖 的 生成子圖 ,同時要求是樹。也即在圖的邊集中選擇 n - 1 條,將所有頂點連通。 我們

    2024年02月16日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包