时间:2016-04-08 18:05:09 星期五
题目编号:[2016-04-08][POJ][3159][Candies]
题目大意:n个小孩,m条信息,每条信息a ,b ,c,表示b小孩得到的糖不能比a小孩c个,问n小孩比1小孩最多能多多少个,
分析:直接就是求1到n的最短路(如果不是最短路,那么其他边,总有一种情况不能满足最短路这条边的情况,),直接跑一次Dijkstra
遇到的问题:使用’vector’存图TLE了,改成用数组实现的邻接表才A
#include <queue>#include <algorithm>#include <cstring>#include <cstdio>using namespace std;const int maxn = 3 * 1E4 + 10;const int maxe = 15 * 1E4 + 10;int mhead[maxn],nxt[maxe],mend[maxe],mcost[maxe],q;int vis[maxn],d[maxn];inline void addedge(int from,int to,int c){ mend[q] = to; nxt[q] = mhead[from]; mcost[q] = c; mhead[from] = q++;}inline void ini(){ memset(mhead,-1,sizeof(mhead)); q = 2;}struct mNode{ int u,c; mNode(int _u = 0,int _c = 0):u(_u),c(_c){} bool operator < (const mNode & a)const{ return c > a.c; }};void Dijkstra(int s){ memset(vis,0,sizeof(vis)); memset(d,0x3f,sizeof(d)); priority_queue<mNode> q; d[s] = 0; q.push(mNode(s,0)); mNode tmp; while(!q.empty()){ tmp = q.top(); q.pop(); int u = tmp.u; if(vis[u]) continue; vis[u] = 1; for(int e = mhead[u];~e;e = nxt[e]){ int v = mend[e]; if(!vis[v] && d[v] > d[u] + mcost[e]){ d[v] = d[u] + mcost[e]; q.push(mNode(v,d[v])); } } }}int main(){ int n,m,a,b,c; ini(); scanf("%d%d",&n,&m); for(int i = 0 ; i < m ; ++i){ scanf("%d%d%d",&a,&b,&c); addedge(a,b,c); } Dijkstra(1); printf("%d\n",d[n]); return 0;}