πŸ™‡β€β™€οΈ[Gold IV] νƒ€μž„λ¨Έμ‹  - 11657

문제 링크

μ„±λŠ₯ μš”μ•½

λ©”λͺ¨λ¦¬: 2340 KB, μ‹œκ°„: 8 ms

λΆ„λ₯˜

λ²¨λ§Œβ€“ν¬λ“œ, κ·Έλž˜ν”„ 이둠, μ΅œλ‹¨ 경둜

제좜 일자

2024λ…„ 3μ›” 5일 11:31:33

문제 μ„€λͺ…

N개의 λ„μ‹œκ°€ μžˆλ‹€. 그리고 ν•œ λ„μ‹œμ—μ„œ μΆœλ°œν•˜μ—¬ λ‹€λ₯Έ λ„μ‹œμ— λ„μ°©ν•˜λŠ” λ²„μŠ€κ°€ M개 μžˆλ‹€. 각 λ²„μŠ€λŠ” A, B, C둜 λ‚˜νƒ€λ‚Ό 수 μžˆλŠ”λ°, AλŠ” μ‹œμž‘λ„μ‹œ, BλŠ” λ„μ°©λ„μ‹œ, CλŠ” λ²„μŠ€λ₯Ό 타고 μ΄λ™ν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ΄λ‹€. μ‹œκ°„ Cκ°€ μ–‘μˆ˜κ°€ μ•„λ‹Œ κ²½μš°κ°€ μžˆλ‹€. C = 0인 κ²½μš°λŠ” μˆœκ°„ 이동을 ν•˜λŠ” 경우, C < 0인 κ²½μš°λŠ” νƒ€μž„λ¨Έμ‹ μœΌλ‘œ μ‹œκ°„μ„ λ˜λŒμ•„κ°€λŠ” κ²½μš°μ΄λ‹€.

1번 λ„μ‹œμ—μ„œ μΆœλ°œν•΄μ„œ λ‚˜λ¨Έμ§€ λ„μ‹œλ‘œ κ°€λŠ” κ°€μž₯ λΉ λ₯Έ μ‹œκ°„μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 λ„μ‹œμ˜ 개수 N (1 ≀ N ≀ 500), λ²„μŠ€ λ…Έμ„ μ˜ 개수 M (1 ≀ M ≀ 6,000)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 M개의 μ€„μ—λŠ” λ²„μŠ€ λ…Έμ„ μ˜ 정보 A, B, C (1 ≀ A, B ≀ N, -10,000 ≀ C ≀ 10,000)κ°€ 주어진닀.

좜λ ₯

λ§Œμ•½ 1번 λ„μ‹œμ—μ„œ μΆœλ°œν•΄ μ–΄λ–€ λ„μ‹œλ‘œ κ°€λŠ” κ³Όμ •μ—μ„œ μ‹œκ°„μ„ λ¬΄ν•œνžˆ 였래 μ „μœΌλ‘œ 되돌릴 수 μžˆλ‹€λ©΄ 첫째 쀄에 -1을 좜λ ₯ν•œλ‹€. 그렇지 μ•Šλ‹€λ©΄ N-1개 쀄에 걸쳐 각 쀄에 1번 λ„μ‹œμ—μ„œ μΆœλ°œν•΄ 2번 λ„μ‹œ, 3번 λ„μ‹œ, ..., N번 λ„μ‹œλ‘œ κ°€λŠ” κ°€μž₯ λΉ λ₯Έ μ‹œκ°„μ„ μˆœμ„œλŒ€λ‘œ 좜λ ₯ν•œλ‹€. λ§Œμ•½ ν•΄λ‹Ή λ„μ‹œλ‘œ κ°€λŠ” κ²½λ‘œκ°€ μ—†λ‹€λ©΄ λŒ€μ‹  -1을 좜λ ₯ν•œλ‹€.

πŸš€ν’€μ΄

벨만 ν¬λ“œ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•΄μ•Όν•˜λŠ” λ¬Έμ œμ΄λ‹€.

image

πŸš€μ „μ²΄ μ½”λ“œ

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <math.h>

using namespace std;

struct Edge
{
	int s, e, val;
};

const long long MAX = 1234567890;
int n, m;
long long dist[1000];

void solve()
{
	cin >> n >> m;
	vector<Edge> edges;
	int a, b, c;
	for (int i = 1; i <= m; ++i)
	{
		cin >> a >> b >> c;
		edges.push_back({ a, b, c });
	}

	for (int i = 1; i <= n; ++i)
		dist[i] = MAX;
	dist[1] = 0;
	for (int i = 1; i < n; ++i)
	{
		for (int j = 0; j < edges.size(); ++j)
		{
			int s = edges[j].s;
			int e = edges[j].e;
			int w = edges[j].val;
			if (dist[s] != MAX && dist[s] + w < dist[e])
				dist[e] = dist[s] + w;
		}
	}

	for (int i = 0; i < edges.size(); ++i)
	{
		int u = edges[i].s;
		int v = edges[i].e;
		int w = edges[i].val;
		if (dist[u] != MAX && dist[u] + w < dist[v])
		{
			cout << -1 << '\n';
			return;
			//dist[v] = MAX;
		}
	}

	for (int i = 2; i <= n; ++i)
	{
		if (dist[i] == MAX)
			cout << -1 << '\n';
		else
			cout << dist[i] << '\n';
	}
}

int main() 
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	freopen("input.txt", "rt", stdin);

	solve();

	return 0;
}

νƒœκ·Έ:

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ: