uva 1599 - Ideal Path

来源:互联网 发布:linux使用领域 编辑:程序博客网 时间:2024/04/18 20:04
#include <cstdio>#include <cstdlib>#include <iostream>#include <iostream>#include <cstdio>#include <vector>#include <cstring>#include <cctype>#include <algorithm>#include <cmath>#include <cstdlib>#include <queue>#include <map>#define maxn 100000 + 10#define INF 0x7fffffffusing namespace std;vector<int>g[maxn], col[maxn];int d[maxn];bool vis[maxn];int n;void bfs1(){    memset(d, -1, sizeof(d));    memset(vis, false, sizeof(vis));    queue<int>q;    int tmp = n;    q.push(n);    d[n] = 0;    while(!q.empty())    {        tmp = q.front();        q.pop();        int len1 = g[tmp].size();        for(int i = 0; i < len1; ++i)        {            int head = g[tmp][i];            if(!vis[head])            {                vis[head] = true;                if(d[head] == -1)                d[head] = d[tmp]+1;                else d[head] = min(d[tmp]+1, d[head]);                q.push(head);            }        }    }    return;}int ans[maxn];void bfs2(){    memset(ans, 0, sizeof(ans));    memset(vis, false, sizeof(vis));    queue<int>q;    int tmp = 1;    vis[tmp] = true;    q.push(tmp);    while(!q.empty())    {        tmp = q.front();        q.pop();        int len2 = g[tmp].size();        int mincol = INF;        for(int i = 0; i < len2; ++i)        {            int head = g[tmp][i];            if(d[tmp] == d[head]+1)                    mincol = min(col[tmp][i], mincol);        }        int t = d[1] - d[tmp];        if(ans[t] == 0) ans[t] = mincol;        else ans[t] = min(ans[t], mincol);        for(int i = 0; i < len2; ++i)        {            int head = g[tmp][i];            if(col[tmp][i] == mincol && !vis[head] && d[head] == d[tmp]-1)            {                vis[head] = true;                q.push(head);            }        }    }    return;}int main(){    int m;    while(scanf("%d%d", &n, &m) != EOF)    {        for(int i = 1; i <= n; ++i)            g[i].clear();        for(int i = 1; i <= n; ++i)            col[i].clear();        for(int i = 0; i < m; ++i)        {            int l, r, c;            scanf("%d%d%d", &l, &r, &c);            if(l != r){                g[l].push_back(r);                g[r].push_back(l);                col[l].push_back(c);                col[r].push_back(c);            }        }        bfs1();        printf("%d\n", d[1]);//        for(int i = 1; i <= n; ++i)//            printf("%d\n", d[i]);        bfs2();        for(int i = 0; i < d[1]; ++i)        {            if(i) printf(" ");            printf("%d", ans[i]);        }        puts("");    }    return 0;}

0 0
原创粉丝点击