Ideal Path(UVA 1599)

发布于:2024-03-29 ⋅ 阅读:(23) ⋅ 点赞:(0)

网址如下:

Ideal Path - UVA 1599 - Virtual Judge (vjudge.net)

(第三方网站)

写了超久,最后是TLE,实在是累了,先总结一下吧

最后是对bfs有了个更深刻的理解

bfs相当于分层次进行分析处理,所以可以用队列来实现

如果想要将层次分开进行处理的话,可以用两个类似队列的东西(比如数组),然后分成两层判断,慢慢进行下去

我的代码主要是在寻找最小的颜色上花的时间很多

代码如下:

#include<cstdio>
#include<queue>
#include<cstring>
#include<set>
#include<map>
#include<vector>
using namespace std;
struct Point{
    int d;
    map<int, int> p;
    map<int, set<int>> mclr;
    Point():d(0){}
};
void initialize(void);
void bfs1(void);
void bfs2(void);
const int maxn = 100001, maxclr = 1000000001;
int n, m, minstep;
Point pit[maxn];

int main(void)
{
    while(scanf("%d%d", &n, &m) == 2){
        initialize();
        for(int i = 0; i < m; i++){
            int a, b, c; scanf("%d%d%d", &a, &b, &c);
            pit[a].p[b] = c; pit[b].p[a] = c;
        }
        bfs1();
        bfs2();//同时输出
    }

    return 0;
}

void initialize(void)
{
    minstep = 2147483647;
    for(int i = 1; i <= n; i++){
        pit[i].d = 0; pit[i].p.clear();
    }
}
void bfs1(void)
{
    queue<int> q; q.push(n);
    while(!q.empty()){
        int u = q.front(); q.pop();
        if(u == 1) minstep = pit[u].d;
        if(pit[u].d >= minstep) continue;
        for(auto v = pit[u].p.begin(); v != pit[u].p.end(); v++){
            if((*v).first != n && !pit[(*v).first].d){
                pit[(*v).first].d = pit[u].d + 1;
                pit[(*v).first].mclr[pit[u].d].insert(pit[(*v).first].p[u]);
                q.push((*v).first);
            }
        }
    }
}
void bfs2(void)
{
    printf("%d\n", minstep);
    vector<int> q; q.push_back(1);
    vector<int> ans; ans.resize(minstep, maxclr);
    while(!q.empty()){
        int minclr = maxclr, goalD = pit[q.front()].d - 1;
        for(auto it = q.begin(); it != q.end(); it++){
            int clr = *(pit[*it].mclr[goalD].begin());
            minclr = (minclr < clr) ? minclr : clr;
        }//得到当前层数到下一层的最小颜色
        ans[pit[q.front()].d - 1] = minclr;//储存答案
        if(!goalD) break;
        queue<int> tq;//下一层队列
        while(!q.empty()){
            int u = q.back(); q.pop_back();
            //将目标传到下一层队列
            for(auto it = pit[u].p.begin(); it != pit[u].p.end(); it++){
                if(pit[it->first].d == goalD && it->second == minclr) tq.push(it->first);
            }
        }
        //将下一层队列复制到当前队列中
        while(!tq.empty()){
            q.push_back(tq.front()); tq.pop();
        }
    }
    //输出
    while(minstep){
        printf("%d", ans[--minstep]);
        if(minstep) putchar(' ');
    }
    putchar('\n');
}

本文含有隐藏内容,请 开通VIP 后查看