답안 #41704

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
41704 2018-02-21T01:28:19 Z wzy 페리들 (NOI13_ferries) C++11
17 / 40
608 ms 32768 KB
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define pb push_back
#define F first
#define S second
int fx[100005] , n , m;
vector<int> adj[100005] ;
vector<pii>  radj[100005];
vector<int> p[100005];

bool cmp(int i , int j){
	if(fx[i] == fx[j]) return i;
	else{
		return fx[i] > fx[j];
	}
}


int32_t main(){
	scanf("%d%d" , &n , &m);
	vector<pii> edges;
	for(int i = 0 ; i < m ; i++){
		int x, y,z;
		cin>>x>>y>>z;
		x--, y--;
		p[x].pb(z);
		adj[x].pb(y);
		edges.pb(pii(x,y));
	}
	for(int i = 0 ; i < n;i++) sort(p[i].begin() , p[i].end()), fx[i] = (int) 1e18;
	for(int i =0;i<m;i++){
		radj[edges[i].S].pb(pii(p[edges[i].F][0] , edges[i].F));
	}
	priority_queue<pii , vector<pii> , greater<pii> > pq;
	fx[n-1] = 0;
	pq.push(pii(0 , n-1));
	while(!pq.empty()){
		pii u = pq.top();
		pq.pop();
		if(fx[u.S] != u.F) continue;
		for(int j = 0 ; j < radj[u.S].size(); j++){
			pii v = radj[u.S][j];
			if(fx[v.S] > v.F + u.F){
				fx[v.S] = v.F + u.F;
				pq.push(pii(fx[v.S] , v.S));
			}
		}
	}
	for(int i = 0 ; i < n;i++){
		sort(adj[i].begin() , adj[i].end() , cmp);
	}
	for(int i = 0 ; i < n; i++) fx[i] = 1000000005;
	fx[0] = 0;
	pq.push(pii(0 , 0));
	while(!pq.empty()){
		pii u = pq.top();
		pq.pop();
		if(fx[u.S] != u.F) continue;
		for(int j = 0 ; j < adj[u.S].size() ;j++){
			pii v = pii(p[u.S][j] , adj[u.S][j]);
			if(fx[v.S] > v.F + u.F){
				fx[v.S] = v.F + u.F;
				pq.push(pii(fx[v.S] , v.S));
			}
		}
	}
	printf("%d\n" , fx[n-1]);
}

Compilation message

ferries.cpp: In function 'int32_t main()':
ferries.cpp:42:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int j = 0 ; j < radj[u.S].size(); j++){
                     ^
ferries.cpp:60:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int j = 0 ; j < adj[u.S].size() ;j++){
                     ^
ferries.cpp:21:25: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d" , &n , &m);
                         ^
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 7288 KB Output is correct
2 Correct 10 ms 7656 KB Output is correct
3 Correct 39 ms 9448 KB Output is correct
4 Correct 362 ms 25628 KB Output is correct
5 Correct 334 ms 28696 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 28696 KB Output is correct
2 Correct 9 ms 28696 KB Output is correct
3 Correct 31 ms 28696 KB Output is correct
4 Correct 153 ms 28696 KB Output is correct
5 Correct 250 ms 28700 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 52 ms 28700 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 608 ms 32768 KB Output isn't correct
2 Halted 0 ms 0 KB -