ccf地鐵修建

題意:無向圖,從1到n的所有路徑中取路徑中最長的那條 比較, 然後輸出值最小的那條。
當時想的是直接深搜, 記錄當前路徑最大值, 到n比較即可。
這樣會出問題,就是從別的地方搜過來就會破壞掉原有的順序,那麼記錄路徑的最大值就會出現問題了。簡直被自己蠢哭。

放上自己比賽時的錯誤代碼和錯誤例子

#include <bits/stdc++.h>
using namespace std;
struct Node{
    int v, val, id;
    Node(){}
    Node(int _v, int _val, int _id){
        v = _v; val = _val; id = _id;
    }
};
const int maxn = 1e5 + 10;
const int maxm = 4e5 + 10;
vector<Node> vec[maxn];
int vis[maxm]; int ans = 0x3f3f3f3f; int n , m ;
void dfs(int u , int value){
    cout << "u  = " << u << " " << "value = " << value << endl;
    system("pause"); 
    if(u == n) {
        ans = min(ans, value); return ;
    }
    for(int i = 0 ; i < vec[u].size(); i ++){
        int v = vec[u][i].v; int val = vec[u][i].val; int id = vec[u][i].id;
        if(vis[id]) continue;
        vis[id] = 1;
        dfs(v, max(value, val));
    } 
}
int main(){
    int count = 0;
    freopen("data.out", "r", stdin);
    cin >> n >> m; memset(vis, 0, sizeof(vis));
    for(int i = 0 ; i < m; i ++){
        int a, b , c; cin >> a >> b >> c;
        vec[a].push_back(Node(b, c, count ++));
        vec[b].push_back(Node(a, c, count ++));
    }
    dfs(1, 0);
    cout << ans << endl;
} 
/*
4 6
1 2 1
1 3 2
2 4 2
4 3 4
1 4 3
2 3 3
*/

正解就直接spfa即可, 記錄每個點從1到它路徑上的最大值, 不斷去更新, 輸出n點的即可。

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;

const int oo = 1e9;
const int MAXN = 1e5 + 5;
const int MAXM = 2 * 1e5 + 5;
int N, M;
bool inq[MAXN] = { 0 };
int opt[MAXN];

struct Edge
{
    Edge(int _from, int _to, int _weight) :from(_from), to(_to), weight(_weight) {}
    int from, to;
    int weight;
};
vector<Edge> ve;
vector<int> v[MAXN];

void bfs(int s)
{
    queue<int> q;
    q.push(s);
    inq[s] = true;
    opt[s] = 0;
    for (; !q.empty();)
    {
        int t = q.front();
        q.pop();
        inq[t] = false;
        for (int i = 0; i < v[t].size(); i++)
        {
            int e = v[t][i];
            int next = ve[e].to;
            int m;
            if ((m = max(opt[t], ve[e].weight)) < opt[next])
            {
                opt[next] = m;
                if (!inq[next])
                {
                    q.push(next);
                    inq[next] = true;
                }
            }
        }
    }
}

int main()
{
//  freopen("data.out", "r", stdin);
    scanf("%d%d", &N, &M);
    fill(opt + 1, opt + N + 1, oo);
    int f, t, w;
    for (int i = 0; i < M; i++)
    {
        scanf("%d%d%d", &f, &t, &w);
        ve.push_back(Edge(f, t, w));
        ve.push_back(Edge(t, f, w));
        v[f].push_back(ve.size() - 2);
        v[t].push_back(ve.size() - 1);
    }
    bfs(1);
    cout << opt[N] << endl;

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章