关闭

pku 3411 Paid Roads

478人阅读 评论(0) 收藏 举报

搜的,刚才就是说的这题。

如果可以减少花费, 就要再次进队,不然就算了。

这题写的不是很好,有更好的实现方式的。

#include <iostream>
#include <bitset>
#include <iomanip>
#define N 11
#define MM 100000
#define MAX_LEN 1000

using namespace std;

struct TNode
{
	int b,r;
	int c,p;
	TNode *next;
	TNode(int bb,int cc,int pp, int rr):b(bb),r(rr),c(cc),p(pp),next(NULL){}
};

struct Node
{
	TNode *next;
	Node():next(NULL){}
};

Node adj[N];
int n;
inline void addEdge(int a,int b,int c,int p,int r)
{	
	TNode *t = new TNode(b,c,p,r);
	t->next = adj[a].next;
	adj[a].next = t;
}

int dest;
int cost[(1<<10)][10]={false};// cost[i][j] record cost to j in state i
struct QNode
{
	int path;
	int city;
	int cost;
};

QNode que[MAX_LEN];
int top,end;

inline int getBit(int a,int p)
{
	return ((a>>p)& 0x01);
}
inline int setBit(int a,int p)
{ 
	return (a|(1<<p));
}
void bfs()
{
	top = 0;
	end = 1;
	que[0].city = 0;
	que[0].path = 1;
	que[0].cost = 0;
	cost[1][0] = 0;

	QNode tmp;
	TNode * t;

	while (top != end)
	{
		tmp = que[top];
		++top;
		t = adj[tmp.city].next;
		while (t != NULL)
		{
			que[end].path = setBit(tmp.path,t->b);
			que[end].city = t->b;
			que[end].cost = tmp.cost + t->r;
			if (cost[que[end].path][que[end].city]==-1 || que[end].cost < cost[que[end].path][que[end].city])
			{
				cost[que[end].path][que[end].city] = que[end].cost;
				++end;
			}

			if (getBit(tmp.path,t->c) == 1) 
			{
				que[end].path = setBit(tmp.path,t->b);
				que[end].city = t->b;
				que[end].cost = tmp.cost + t->p;
				if (cost[que[end].path][que[end].city]==-1 || que[end].cost < cost[que[end].path][que[end].city])
				{
					cost[que[end].path][que[end].city] = que[end].cost;
					++end;
				}
			}
			t = t->next;
		}
	}
}

void output()
{
	int re = MM;
	for (int I=0; I< (1<<10); ++I)
	{
		if (cost[I][dest] >=0 && cost[I][dest]<re)
			re = cost[I][dest];
	}
	if (re == MM)
		cout<<"impossible"<<endl;
	else
		cout<<re<<endl;
}

int main()
{
	int a,b,c,p,r;
	cin>>dest>>n;
	--dest;
	for (int I=0; I<n; ++I)
	{
		cin>>a>>b>>c>>p>>r;
		--a; --b;--c;
		addEdge(a,b,c,p,r);
	}

	memset(cost, -1, sizeof(cost));
	bfs();
	output();
	return 0;
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

构筑极致用户体验-ROADs

通信世界网消息(CWW) 信息时代发展到今天,物理世界和数字世界正在加速融合,人类社会正发生着剧烈的改变,人类的情感、财富、知识、历史……正在加速从线下转移到线上,以“0101”的形式被发送、传送、接...
  • holandstone
  • holandstone
  • 2015-10-29 12:40
  • 2465

ACM PKU 题目分类(完整整理版本)

DP:  1011   NTA                 简单题  1013...
  • qq_16542775
  • qq_16542775
  • 2016-03-06 17:35
  • 1272

IOS 审核 被拒 及 解决

博文智控 app 被拒绝 提示 需要给出演示视频,于是我拍摄了演示视频,上传到了优酷视频网站 并想app 审核机构 提供给了演示视频的地址 如下 :http://v.youku.com/v_show/...
  • wokenshin
  • wokenshin
  • 2016-05-03 14:45
  • 3503

POJ3411-Paid Roads【class】

  • 2011-08-15 18:07
  • 9KB
  • 下载

POJ 3411 Paid Roads(搜索的小技巧)

题意:给你n个点,
  • xu12110501127
  • xu12110501127
  • 2014-04-10 08:12
  • 600

Poj 3411 Paid Roads

题目大意是:给定一个N和M,N代表城市数目(城市以1-N命名),其中有M条边连接这些城市,城市之间可能有重边。接下来有M行。每行有5个输入,分别为ai,bi,ci,pi和ri。ai表示第i条边的起始城...
  • Detective_Xin
  • Detective_Xin
  • 2012-01-21 10:19
  • 450

poj 3411 Paid Roads

题目大意 有n座城市和m(1 注意:路径是有向的。 算法思想:dfs可过。 提示:最优解法不是每条路只允许走一遍,可能有情况满足某条路i的p比r小很多,而且走c城市再回来走总钱数比直接走、付...
  • zero_from
  • zero_from
  • 2016-08-02 17:06
  • 162

poj 3411 Paid Roads(dfs+标记路径->求最少花费)

Paid Roads Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit...
  • yjf3151731373
  • yjf3151731373
  • 2017-11-14 17:52
  • 57

POJ 3411-Paid Roads(状态压缩+dijkstra算法+floyd-warshall算法)

题目大意:给出一张有向图,求点1到点N的最短路,不同的是,对于每一条边,除了源点目标点和花费以外,还有额外点c,若走这条边之前到达过c点,花费会减少到另一个值P。如果最短路不存在,输出impossib...
  • dilemma729
  • dilemma729
  • 2015-03-01 23:10
  • 422

POJ 3411 Paid Roads(DFS)

题意  你要从第1个城市到第N个城市去   有m条路  每条路用a, b, c, p, r 表示  你从第a个城市到第b个城市时  若之前经过或现在位于第c个城市  过路费就是p元  否则就是r元  ...
  • acvay
  • acvay
  • 2015-08-03 16:04
  • 462
    个人资料
    • 访问:42752次
    • 积分:834
    • 等级:
    • 排名:千里之外
    • 原创:37篇
    • 转载:6篇
    • 译文:0篇
    • 评论:4条
    文章分类