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
- poj 2457 Part Acquisition
- poj 2457 Part Acquisition
- poj 2457 Part Acquisition-dijkstra
- 【POJ】2457 Part Acquisition bfs
- POJ Part Acquisition 2457 dijkstra
- POJ 2457 Part Acquisition(最短路)
- POJ 2457 Part Acquisition 最短路径
- poj 2457 Part Acquisition 最短路spfa
- POJ 2457 Part Acquisition (Dijkstra + 记录路径)
- POJ 2457 Part Acquisition【Dij+记录路径】
- POJ part acquisition
- POJ 2457 Part Acquisition(记录路径单源最短路)
- poj——2457——Part Acquisition
- poj 2457 Part Acquisition 【spfa最短路 + STL路径输出】
- POJ 2457--Part Acquisition 【spfa最短路 + STL路径输出】
- poj 2457 Part Acquisition最短路径dijikstra迪杰斯特拉
- bzoj1674 [Usaco2005]Part Acquisition
- 1674: [Usaco2005]Part Acquisition
- Zygote进程简介
- Linux USB驱动详解
- Java基本线程机制(二)
- MongoDB:mongodb的安装和增删改查入门
- 用GNS3模拟Cisco ASA
- poj 2457 Part Acquisition
- 实例解析 用linux操作系统构建的路由器
- C++数学计算库与软件
- 上拉电阻与下拉电阻的作用
- 不是所有的MapReduce程序都要在MapReduce上执行
- 开源组织和社区概述小结
- LRU和LFU的区别
- Linux PPP详细介绍
- Linux USB驱动工作流程