제출 #201230

#제출 시각아이디문제언어결과실행 시간메모리
201230aintaOlympic Bus (JOI20_ho_t4)C++17
100 / 100
52 ms3756 KiB
#include<cstdio>
#include<algorithm>
#include<queue>
#define N_ 2010
#define pli pair<long long,int>
using namespace std;
vector<int>E[N_], F[N_], G[N_];
vector<int>L[N_], Num[N_];
int n, m, Path[N_], chk[101000];
int SP[N_], EP[N_], imp[N_], H[N_], vv[N_];
long long SD[N_], ED[N_], D[N_], DD[101000][2], INF = 1e18, U[N_];

int ord[N_];

priority_queue<pli>PQ;
struct Edge {
	int a, b, c, d;
}Ed[101000];
void Push(int a, int p, long long c) {
	if (D[a] <= c)return;
	D[a] = c;
	Path[a] = p;
	PQ.push({ -c,a });
}
void Dijk(int a) {
	int i;
	for (i = 1; i <= n; i++)D[i] = INF, Path[i] = 0, vv[i] = 0;
	Push(a, 0, 0);
	while (!PQ.empty()) {
		pli tp = PQ.top();
		PQ.pop();
		int x = tp.second;
		if (vv[x])continue;
		vv[x] = 1;
		for (int i = 0; i < E[x].size(); i++) {
			Push(E[x][i], Num[x][i], D[x] + L[x][i]);
		}
	}
}
int cnt;
void DFS(int a, int pp) {
	int i;
	if (imp[a]) {
		H[a] = a;
		ord[a] = cnt--;
	}
	else H[a] = H[pp];
	for (auto &x : G[a]) {
		DFS(x, a);
	}
}
void Do(int st, int ed, int ck) {
	int i, j;

	for (i = 1; i <= n; i++) {
		G[i].clear();
		E[i].clear();
		F[i].clear();
		L[i].clear();
		Num[i].clear();
	}

	for (i = 1; i <= m; i++) {
		E[Ed[i].a].push_back(Ed[i].b);
		L[Ed[i].a].push_back(Ed[i].c);
		Num[Ed[i].a].push_back(i);
	}

	Dijk(st);
	long long d = D[ed];
	DD[0][ck] = d;
	for (i = 1; i <= n; i++) SD[i] = D[i];


	for (i = 1; i <= n; i++) {
		E[i].clear();
		L[i].clear();
		Num[i].clear();
	}

	for (i = 1; i <= m; i++) {
		E[Ed[i].b].push_back(Ed[i].a);
		L[Ed[i].b].push_back(Ed[i].c);
		Num[Ed[i].b].push_back(i);
	}

	Dijk(ed);

	for (i = 1; i <= n; i++) {
		ED[i] = D[i];
		EP[i] = Path[i];
		H[i] = imp[i] = 0;
	}
	for (i = 1; i <= n; i++) {
		if(EP[i])G[Ed[EP[i]].b].push_back(i);
	}
	for (i = 1; i <= m; i++)chk[i] = 0;
	int x = st;
	imp[st] = imp[ed] = 1;
	if (d < INF) {
		while (x != ed) {
			imp[x] = 1;
			int t = EP[x];
			chk[t] = 1;
			x = Ed[t].b;
		}
	}
	for (i = 1; i <= m; i++) {
		if (!chk[i]) {
			DD[i][ck] = SD[Ed[i].b] + ED[Ed[i].a] + Ed[i].c;
			DD[i][ck] = min(DD[i][ck], d);
		}
		else DD[i][ck] = INF;
	}
	for (i = 1; i <= n; i++)U[i] = INF;
	cnt = n;
	DFS(ed, 0);
	for (i = 1; i <= m; i++) {
		if (chk[i])continue;
		int a = H[Ed[i].a], b = H[Ed[i].b];
		if (ord[a] < ord[b]) {
			long long t = SD[Ed[i].a] + ED[Ed[i].b] + Ed[i].c;
			for (j = ord[a]; j < ord[b]; j++) {
				U[j] = min(U[j], t);
			}
		}
	}
	for (i = 1; i <= m; i++) {
		if (!chk[i])continue;
		int a = ord[Ed[i].a], b = ord[Ed[i].b];
		if (a > b)swap(a, b);
		DD[i][ck] = min(DD[i][ck],U[a]);
	}
}
int main() {
	int i, j;
	scanf("%d%d", &n, &m);
	for (i = 1; i <= m; i++) {
		int a, b, c, d;
		scanf("%d%d%d%d", &a, &b, &c, &d);
		Ed[i] = { a,b,c,d };
	}
	Do(1, n, 0);
	Do(n, 1, 1);
	long long res = INF;
	for (i = 0; i <= m; i++) {
		res = min(res, DD[i][0] + DD[i][1] + Ed[i].d);
	}
	if (res > 8e17)res = -1;
	printf("%lld\n", res);
}

컴파일 시 표준 에러 (stderr) 메시지

ho_t4.cpp: In function 'void Dijk(int)':
ho_t4.cpp:35:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < E[x].size(); i++) {
                   ~~^~~~~~~~~~~~~
ho_t4.cpp: In function 'void DFS(int, int)':
ho_t4.cpp:42:6: warning: unused variable 'i' [-Wunused-variable]
  int i;
      ^
ho_t4.cpp: In function 'int main()':
ho_t4.cpp:136:9: warning: unused variable 'j' [-Wunused-variable]
  int i, j;
         ^
ho_t4.cpp:137:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d", &n, &m);
  ~~~~~^~~~~~~~~~~~~~~~
ho_t4.cpp:140:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d%d%d", &a, &b, &c, &d);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...