您的位置:首页 > 编程语言

【poj 1724】ROADS 题意&题解&代码(C++)

2016-04-07 08:49 465 查看
题目链接:

http://poj.org/problem?id=1724

题意:

给出总钱数 pay(题上的K) ,再给出总点数n,总边数m。

接下来输入m条边,每条边都是单向边,每条边有四个信息a,b,l,c。

表示从a到b有一条边长为l,过路费为c的边。

每过一条边都要交过路费,若当前总钱数小于过路费,则不能走,问从1走到n的最短路(距离最短,花费在总钱数以内)。

题解:

第一次写dijkstra,感觉很神奇,也不知道到底是不是,反正就这么叫了。。

参考博客:

/article/6666357.html

代码:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<queue>
#include<vector>
using namespace std;
int pay,n,m;
struct node{
int n;int d;int c;
bool operator < (const struct node a) const
{
if (a.d == d) return a.c<c;
return a.d<d;
}
};
struct edge{
int v;int d;int c;
};
priority_queue<node>q;
vector<edge>lin[110];
int dj()
{
while(!q.empty()) q.pop();
node st; st.n=1;st.c=0;st.d=0;
q.push(st);
while(!q.empty())
{
node now=q.top();q.pop();
if (now.n==n)
return now.d;
for (int i=0;i<lin[now.n].size();i++)
{
node nex;
nex.n=lin[now.n][i].v;
nex.d=now.d+lin[now.n][i].d;
nex.c=now.c+lin[now.n][i].c;
if (nex.c<=pay) q.push(nex);
}
}
return -1;
}
int main()
{
scanf("%d%d%d",&pay,&n,&m);
for (int i=1;i<=m;i++)
{
int x,y,di,ci;
scanf("%d%d%d%d",&x,&y,&di,&ci);
edge xv;
xv.v=y;xv.d=di;xv.c=ci;
lin[x].push_back(xv);
}
printf("%d\n",dj());
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: