#include <cstdio>#include <vector>usingnamespacestd;intTEST_CASE;intlocationCount;intedgeCount;intfireCount;intstationCount;vector<pair<int,int>>vec[1001];// first 목적지, second 거리vector<int>StationLocation;vector<int>fireLocation;intdist[1001];intcheck[1001];intanswer[1001];intINF=10000000;intmain(){scanf("%d",&TEST_CASE);for(inti=0;i<TEST_CASE;i++){StationLocation.clear();fireLocation.clear();for(inti=0;i<1001;i++){vec[i].clear();}scanf("%d %d %d %d",&locationCount,&edgeCount,&fireCount,&stationCount);for(intj=0;j<edgeCount;j++){intfrom,to,length;scanf("%d %d %d",&from,&to,&length);vec[from].push_back(make_pair(to,length));vec[to].push_back(make_pair(from,length));}for(intk=0;k<fireCount;k++){intfire;scanf("%d",&fire);fireLocation.push_back(fire);}for(intl=0;l<stationCount;l++){intstation;scanf("%d",&station);vec[0].push_back(make_pair(station,0));}// dijkstrafor(intt=0;t<=locationCount;t++){// dist 초기화dist[t]=INF;check[t]=false;}// 가상의 점 ( 소방서까지 0의 거리 ) dist[0]=0;// 시작 위치를 0으로 초기화for(into=0;o<locationCount-1;o++){// 도시 갯수 -1 번만큼 반복하기 위함intmin=INF;inthere=-1;// 현재위치for(intn=0;n<=locationCount;n++){// 원래는 1부터 돌리는 것이나 0이라는 가상의 점을 돌린다if(!check[n]&&min>dist[n]){//방문하지 않고 가장 작은 값 찾기min=dist[n];here=n;}}check[here]=true;for(intp=0;p<vec[here].size();p++){// 인접 정점들을 모두 보면서 dist 갱신if(dist[vec[here][p].first]>dist[here]+vec[here][p].second)//목적지의 현재 dist의 최단경로 값보다 지금 위치에서 가는 것이 작을 때 갱신dist[vec[here][p].first]=dist[here]+vec[here][p].second;}}inttotal=0;for(inty=0;y<fireCount;y++){total+=dist[fireLocation[y]];}printf("%d\n",total);}return0;}
문제를 풀다가 처음에는 모든 소방서에서 다익스트라를 돌렸는데 시간초과가 나와서, 가상의 점 0 번에서 소방서로 0의 거리로 갈 수 있다는 것을 만들어서 다시 작성해보았습니다.
우선 테스트케이스는 잘 나온는데 오답이 나오네요..
어떤것이 틀린걸까요?
7년 전
0개의 댓글이 있습니다.
정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면
온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야
합니다. 현재 문제를 푸셨습니다.
bgc8214
코드
문제를 풀다가 처음에는 모든 소방서에서 다익스트라를 돌렸는데 시간초과가 나와서, 가상의 점 0 번에서 소방서로 0의 거리로 갈 수 있다는 것을 만들어서 다시 작성해보았습니다.
우선 테스트케이스는 잘 나온는데 오답이 나오네요..
어떤것이 틀린걸까요?
7년 전