본문으로 바로가기

[백준]1753번 문제

category 카테고리 없음 2017. 7. 2. 22:34



//단방향 

//특정 노드를 기준으로 거리를 나타냄


#include <cstdio>

#include <queue>

#include <vector>

#define INF 987654321


using namespace std;


int V,E,S;

vector< vector < pair <int, int> > > mat(20001);

//<도착점,비용>

vector<int> dijkstra(int s){


priority_queue<pair<int, int>,vector<pair<int, int> >,greater<pair<int, int> > > pq;

//자료형,구현체,비교연산자

//비교 연산자에는 less<자료형>과 greater<자료형>이 있습니다. 

    //less는 큰 순서대로, greater은 작은 순서대로 출력됨

        


  pq.push(make_pair(0,s)); //pq는 cost,위치

  vector<int> dist(V+1,INF); //dist 는 INF 값으로 초기화된 V+q개의 원소를 갖는다.


  dist[s]=0;


  while(!pq.empty())

  {

    int cost = pq.top().first, here = pq.top().second;

    pq.pop();

    

if(dist[here] < cost) continue;

for(int i=0;i<mat[here].size();i++)

{

      int nextcost = cost + mat[here][i].second;

      int there = mat[here][i].first;

      

  if(dist[there] > nextcost)

  {

        dist[there] = nextcost;

        pq.push(make_pair(nextcost,there));

      }


    }


  }

  return dist;

}


int main(){

  scanf("%d %d %d",&V,&E,&S);

  for(int i=0;i<E;i++){

    int u,v,w;

    scanf("%d %d %d",&u,&v,&w);

    mat[u].push_back(make_pair(v,w));

  }

  vector<int> dist = dijkstra(S);

  for(int i=1;i<=V;i++){

    if(dist[i]==INF)

      printf("INF\n");

    else printf("%d\n",dist[i]);

  }

}