답안 #467880

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
467880 2021-08-25T10:18:00 Z shanem_1401 Cities (BOI16_cities) C++14
15 / 100
246 ms 262148 KB
#include <bits/stdc++.h>
#define pii pair<int, int>
#define mp make_pair
#define pb push_back
#define fi first
#define se second
using namespace std;
typedef long long ll;
int n, m, k;
int main()
{
	scanf("%d %d %d",& n,& k,& m);
	vector<int>penting;
	for(int i=0; i<k; i++)
	{
		int temp;
		scanf("%d",& temp);
		penting.push_back(temp);
	}
	vector<pii>v[n+2];
	for(int i=0; i<m; i++)
	{
		int from, to, cost;
		scanf("%d %d %d",& from,& to,& cost);
		v[from].pb(mp(cost, to));
		v[to].pb(mp(cost, from));
	}
	ll dist[n+2][n+2];
	for(int i=1; i<=n; i++)
		fill(dist[i]+1, dist[i]+n+1, 2e18);
	if(k==2)
	{
		penting.resize(3, penting[0]);
		k=3;
	}
	for(int i=1; i<=n; i++)
	{
		priority_queue<pair<ll, int> >pq;
		pq.push(mp(0, i));
		dist[i][i]=0;
		while(!pq.empty())
		{
			ll cost=-pq.top().fi;
			int from=pq.top().se;
			pq.pop();
			if(dist[i][from]!=cost)
				continue;
			for(int j=0; j<v[from].size(); j++)
			{
				int to=v[from][j].se;
				ll price=v[from][j].fi+cost;
				if(dist[i][to]>price)
				{
					dist[i][to]=price;
					pq.push(mp(-price, to));
				}
			}
		}
	}
	ll mini=2e18;
	if(k==3)
	{
		for(int i=1; i<=n; i++)
		{
			ll total=0;
			for(int j=0; j<k; j++)
				total+=dist[penting[j]][i];
			mini=min(mini, total);
		}
	}
	else
	{
		for(int x=1; x<=n; x++)
		{
			for(int y=1; y<=n; y++)
			{
				ll total=dist[x][y];
				for(int j=0; j<k; j++)
					total+=min(dist[penting[j]][x], dist[penting[j]][y]);
				mini=min(mini, total);
			}
		}
	}
	printf("%lld\n", mini);
}
/*
6 4 5
1 2 4 5
1 3 1
2 3 2
4 6 1
5 6 2
3 6 3
*/

Compilation message

cities.cpp: In function 'int main()':
cities.cpp:48:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   48 |    for(int j=0; j<v[from].size(); j++)
      |                 ~^~~~~~~~~~~~~~~
cities.cpp:12:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   12 |  scanf("%d %d %d",& n,& k,& m);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
cities.cpp:17:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   17 |   scanf("%d",& temp);
      |   ~~~~~^~~~~~~~~~~~~
cities.cpp:24:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   24 |   scanf("%d %d %d",& from,& to,& cost);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
3 Correct 1 ms 204 KB Output is correct
4 Correct 1 ms 204 KB Output is correct
5 Incorrect 1 ms 288 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 243 ms 262148 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 192 ms 8240 KB Output is correct
2 Correct 186 ms 8280 KB Output is correct
3 Correct 71 ms 8260 KB Output is correct
4 Correct 65 ms 2272 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 219 ms 262148 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 246 ms 262148 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -