大意是有向图,你能比前面的小孩最多吃多少糖,求N的小孩比第一个多多少
优先队列实现真的厉害
每次取可取的最大路并且更新与原点的距离
/*
poj 3159 candies
稀疏图求单源最短路
dijkstra算法
肯定是找到第一个差距最大的,后面再有差距最大的不满足了
郭老师.jpg
优先队列真的太妙了!
*/
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = 30010;
struct node
{
int en;//边的终点
int w;//边的权重
};
bool operator <(const node&d1, const node&d2)
{
return d1.w > d2.w;
}
priority_queue<node>pq;//最大权值在最前
bool caled[maxn] = {};
vector<vector<node>>v;//邻接表
int main()
{
int N, M, a, b, c;
node p;
int i, j;
cin >> N >> M;
v.clear();
v.resize(N + 1);
memset(caled, 0, sizeof(caled));
for (int i = 1; i < M; i++)
{
cin >> a >> b >> c;
p.en = b;
p.w = c;
v[a].push_back(p);
}
p.en = 1;//p是原点
p.w = 0;
pq.push(p);
while (!pq.empty())
{
p = pq.top();
pq.pop();
if (caled[p.en])
{
continue;
}//已经求出最短路径
caled[p.en] = true;
if (p.en == N)
{
break;
}
for (i =0, j = v[p.en].size(); i < j; i++)
{
node q;//遍历子节点
q.en = v[p.en][i].en;
if (caled[q.en])
{
continue;
}
q.w = p.w + v[p.en][i].w;
pq.push(q);
}
}
printf("%d", p.w);
system("pause");
return 0;
}
空的vector的clear()可能造成错误...