1753번 - 최단경로
#include <cstdio>#include <vector>#include <utility>using namespace std;vector < pair<int ,int> > a[20001];vector < pair<int, int> > s;vector < int > ans;
void dfs(int v) { for(int i = 0; i < a[v].size(); i++) { s.push_back(make_pair(a[v][i].first, s.empty()? a[v][i].second : s.back().second+a[v][i].second)); if(ans[s.back().first] > s.back().second) { ans[s.back().first] = s.back().second; } dfs(a[v][i].first); } s.pop_back(); return;}int main() { int v, e, start; scanf("%d %d", &v, &e); scanf("%d", &start); for(int i = 0; i < e; i++) { int u, v, w; scanf("%d %d %d", &u, &v, &w); a[u].push_back(make_pair(v, w)); } for(int i = 0; i <= v; i++) { ans.push_back(1000000); } ans[start] = 0; s.push_back(make_pair(start, 0)); dfs(start); for(int i = 1; i <= v; i++) { if(ans[i] == 1000000 ) printf("%s\n", "INF"); else printf("%d\n", ans[i]); } return 0;}
main 안에 v가 두번 선언되어있네요. 저거때문 아닐까요?
그건아닌것같아요ㅠㅠ똑같아요바꿔도
그게 아니라면 dfs함수를 너무 많이 불러와서 메모리 부족으로 인해 런타임에러가 나오는 것 밖에 생각이 안나네요.
그리고 12번줄에 s.empty()? 할 필요가 있나요? s가 비어있는 경우는 생각이 안나네요.
댓글을 작성하려면 로그인해야 합니다.
srrsr 6년 전
#include <cstdio>
#include <vector>
#include <utility>
using namespace std;
vector < pair<int ,int> > a[20001];
vector < pair<int, int> > s;
vector < int > ans;
void dfs(int v) {
for(int i = 0; i < a[v].size(); i++) {
s.push_back(make_pair(a[v][i].first, s.empty()? a[v][i].second : s.back().second+a[v][i].second));
if(ans[s.back().first] > s.back().second) {
ans[s.back().first] = s.back().second;
}
dfs(a[v][i].first);
}
s.pop_back();
return;
}
int main() {
int v, e, start;
scanf("%d %d", &v, &e);
scanf("%d", &start);
for(int i = 0; i < e; i++) {
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
a[u].push_back(make_pair(v, w));
}
for(int i = 0; i <= v; i++) {
ans.push_back(1000000);
}
ans[start] = 0;
s.push_back(make_pair(start, 0));
dfs(start);
for(int i = 1; i <= v; i++) {
if(ans[i] == 1000000 ) printf("%s\n", "INF");
else printf("%d\n", ans[i]);
}
return 0;
}