poj 2457 Part Acquisition

来源:互联网 发布:和其正 知乎 编辑:程序博客网 时间:2024/05/29 13:21

奶牛们被送往太空去执行一个任务:为它们的农场收购一台挤奶机器。它们正通过一个含有N颗行星的星系。(1<=N<=50 000),每颗行星都是一个交易站。    奶牛们决定了使用 K种(1<=K<=1000)种商品在这些星球中进行交易。这些星球没有发展货币,所以星球交易都是在货易系统下工作的:所有的交易都是用一种货物交换另外一种货物。假设互相交易的两种货物是不同的。    奶牛们从地球出发,带着一罐高品质的干草(货物1号),它们想最终用罐干草换回一台挤奶机器(货物K号)。你们经常喝奶牛们的牛奶,奶牛们请你帮忙:确定如何与该星系所有星球交易,最后得到得到货物K号,奶牛们要你构造最好的交易序列。如果无论如何都不可能最后换得货物K号,那么输出“-1”。


记录每个星球的买入卖出a,b 就是object a to b 的长度为1 的路径

最后spfa(1) ,输出dist[k]


//poj 2457 Part Acquisition/* * 记录每个星球的买入卖出a,b 就是object a to b 的长度为1 的路径 * 最后spfa(1) ,输出dist[k] * author licatweijei */#include <cstdio>#include <cstdlib>#include <iostream>using namespace std;#define INF 1000000#define MAXE 1000100#define MAXV 1001#include <queue>#include <cstring>int dist[MAXV];int fa[MAXV];deque<int> pqu;bool visited[MAXV];int cnt[MAXV];int last[MAXV];struct edge{    int x,y,d;    int next;}edges[MAXE];int len;int first[MAXV];int V; // to be difinevoid init(int v){    memset(cnt,0,sizeof(cnt));    memset(visited,false,sizeof(visited));    memset(first,0,sizeof(first));    memset(last,0,sizeof(last));    len = 0;    V = v;}void add_edge(int x,int y,int d){    ++len;    edges[len].x = x;    edges[len].y = y;    edges[len].d = d;    edges[len].next = first[x];    first[x] = len;}bool spfa(int st){    for (int i=0;i<=V;i++)    {        dist[i] = INF;    }    dist[st] = 0;    visited[st] = true;    pqu.push_front(st);    while(!pqu.empty()){        int now = pqu.front();        pqu.pop_front();        visited[now] = false;        for (int nt = first[now];nt!=0;nt = edges[nt].next){            if (edges[nt].d + dist[now] < dist[edges[nt].y] ) {                dist[edges[nt].y] =  edges[nt].d + dist[now];                last[edges[nt].y] = now;                if (!visited[edges[nt].y]){                    visited[edges[nt].y] = true;                    cnt[edges[nt].y]++;                    if (cnt[edges[nt].y]>V) return false;                    if (!pqu.empty()){                        if (dist[edges[nt].y]>dist[pqu.front()])                            pqu.push_back(edges[nt].y);                        else                            pqu.push_front(edges[nt].y);                    } else pqu.push_front(edges[nt].y);                }            }        }    }    return true;}#include <stack>int main (){    int n,k;    while(cin >> n >> k){        init(k);        int a,b;        for (int i=1;i<=n;i++){            cin >> a >> b;            add_edge(a,b,1);        }        spfa(1);        if (dist[k]==INF)            cout << -1 << endl;        else {            int ans = 0;            stack<int> path;            int t = k;            while(t!=0)                path.push(t),t = last[t];            cout << dist[k]+1 << endl;            while(!path.empty()){                cout << path.top() << endl;                path.pop();            }        }    }}


0 0
原创粉丝点击