POJ1724ROADS

题目大意

你和你女朋友分手了,你想从1号城市跑到n号城市,每条道路有长度和花费,你的经费有限,所以你想在不超出经费限制的情况下,走最短的路到达n号城市

思路

带限制的最短路,不过这道题还是很水的,将dijkkstra里加上一个coin花费限制,然后跑最短路就行了,因为没有要求花费最小,所以我们只需要在不超过钱数限制的情况下跑最短路,也就是说更新dis值的条件是+coin<=限制&&dis>dis+cost

代码(记得把scanf("%d",&t)去掉)

//By AcerMo
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int M=10500;
struct emm
{
	int to,cost,coin;
}add;
vectorv[M];
struct heap
{
	int to,cost,diss;
	bool friend operator < (heap a,heap b)
	{
		return a.diss>b.diss;
	}
}now,t;
priority_queueq;
int n,m,k;
int dis[150][M];
void dijkstra()
{
	memset(dis,0x3f,sizeof(dis));
	now.to=1;now.cost=0;now.diss=0;dis[1][0]=0;q.push(now);
	while (q.size())
	{
		now=q.top();q.pop();
		if (now.to==n) 
		{
			printf("%d\n",now.diss);return ;
		}
		for (int i=0;ik) continue;
			if (dis[go][co]>now.diss+pay)
			{
				dis[go][co]=now.diss+pay;
				t.to=go;t.cost=co;t.diss=dis[go][co];
				q.push(t);
			}
		}
	}
	puts("-1");
	return ;
}
void clean()
{
	for (int i=1;i<=n;i++)
	v[i].clear();
	while (q.size()) q.pop();
	return ;
}
int main()
{
	int t,a,b,c,d;
	scanf("%d",&t);
	while (t--)
	{
		scanf("%d%d%d",&k,&n,&m); 
		for (int i=1;i<=m;i++)
		{
			scanf("%d%d%d%d",&a,&b,&c,&d);
			add.to=b,add.cost=c,add.coin=d;
			v[a].push_back(add);
		}
		dijkstra();clean();
	}
	return 0;
}

你可能感兴趣的:(图论-最短路)