pku 3411 Paid Roads

标签: path struct iostream output null c
490人阅读 评论(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;
}
查看评论

poj3411--Paid Roads(bfs+状压)

题目链接:点击打开链接 题目大意:有n个点,m条有向边,经过边需要一个花费,a b c p q代表 a到b的一条道路,如果经过这条边之前经过c点,那么需要p的花费,否则需要q的花费,问从1点到n点的...
  • u013015642
  • u013015642
  • 2015-07-17 15:13:28
  • 697

poj 3411 Paid Roads

#include #include #include #include /* 对深搜的感悟,深搜一般先找的结果在回溯回来, 更多的是递归。 广搜是解决最短路的首选方法, 如果不能用广搜, 深搜...
  • qqchenjunwei
  • qqchenjunwei
  • 2014-04-21 21:05:14
  • 486

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:31
  • 477

POJ 3411 Paid Roads

题目大意: 给定n个点和m条边,每条边是点i到点j的单向边。当经过这条路前经过了点k,那么在经过这条路时付P的金钱,否则付R的金钱。 求点1到点n的最小花费是多少。 解题思路: ...
  • lin375691011
  • lin375691011
  • 2014-04-09 20:22:34
  • 91524

poj 3411 Paid Roads

这题很特别,因为标记不能简单的为一次,他有可能为多次。。 但又不能不标记,不然无法结束。。   大致题意: 有n座城市和m(1 注意:路径是有向的。 这题难点在于“城市与城市之间可能存...
  • u011519618
  • u011519618
  • 2013-08-20 20:20:50
  • 406

poj 3411 Paid Roads

poj 3411 Paid Roads Description A network of m roads connects N cities (numbered from 1 to N)...
  • yskyskyer123
  • yskyskyer123
  • 2015-08-03 13:51:54
  • 262

POJ 3411 - Paid Roads

Description A network of m roads connects N cities (numbered from 1 to N). There may be more t...
  • zhaosdfa
  • zhaosdfa
  • 2014-06-15 22:17:16
  • 319

POJ 3411 Paid Roads

BFS + 状态压缩
  • u011074149
  • u011074149
  • 2014-10-14 13:25:04
  • 708

POJ 3411-Paid Roads(DFS)

题目链接:传送门 题意:n个城市,m条道路,要求1--N的最小花费。规定从a城市到城市的花费有两种:如果之前到过c,花费为p,否则花费为r。注意:道路是双向的。 难点:可能a到b有多条路而且花费不...
  • qq_16255321
  • qq_16255321
  • 2014-11-25 14:56:01
  • 675

poj3411Paid Roads

题目链接: http://poj.org/problem?id=3411 题目: Paid Roads Time Limit: 1000MS   Memory Limit: 65536K ...
  • u014303647
  • u014303647
  • 2014-06-15 00:42:14
  • 1316
    个人资料
    等级:
    访问量: 4万+
    积分: 847
    排名: 6万+
    文章分类
    最新评论