Submission #5045

#TimeUsernameProblemLanguageResultExecution timeMemory
5045aintaFerries (NOI13_ferries)C++98
40 / 40
276 ms16364 KiB
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
struct A{
	int a, b;
	bool operator <(const A &p)const{
		return b < p.b;
	}
}heap[301000];
vector<int>E[101000], E2[101000];
int n, m, D[101000], top, pv[101000];
int main()
{
	scanf("%d%d", &n, &m);
	int a, b, c, i, x;
	for (i = 0; i < m; i++){
		scanf("%d%d%d", &a, &b, &c);
		E[a].push_back(c);
		E2[b].push_back(a);
	}
	for (i = 1; i <= n; i++){
		if (!E[i].empty())sort(E[i].begin(), E[i].end());
		pv[i] = E[i].size();
		D[i] = 1999999999;
	}
	D[n] = 0;
	heap[top].a = n, heap[top++].b = 0;
	while (1){
		while (top && D[heap[0].a] != -heap[0].b){
			pop_heap(heap, heap + top);
			top--;
		}
		if (!top)break;
		a = heap[0].a, b = D[a];
		pop_heap(heap, heap + top);
		top--;
		for (i = 0; i < E2[a].size(); i++){
			x = E2[a][i];
			--pv[x];
			if (D[x] > b + E[x][pv[x]]){
				D[x] = b + E[x][pv[x]];
				heap[top].a = x, heap[top++].b = -D[x];
				push_heap(heap, heap + top);
			}
		}
	}
	printf("%d\n", D[1]);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...