一个蒟蒻的问题
查看原帖
一个蒟蒻的问题
312306
LJ07楼主2022/2/27 10:34

为甚么我用vector存图就只有10pts10pts,而邻接矩阵存图却过了

vector存图

#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int init() {
	char c;bool f(true);
	while (!isdigit(c = getchar())) {
		if (c == EOF) return EOF;
		f = c != '-';
	}
	int x(c ^ 48);
	while (isdigit(c = getchar())) x = x * 10 + (c ^ 48);
	return f ? x : -x;
}
int n, pri[1005], d[1005], cnt[1005];
vector<pair<int, int> > g[1005];
bool vis[1005];
signed main() {
	n = init();
	for (int i(1); i <= n; ++i) pri[i] = init();
	for (int a, b, c; ~(a = init(), b = init(), c = init()); )
		++a, ++b, ++c, g[a].push_back({b, c}), g[b].push_back({a, c});
	d[0] = 1e18;
	for (int i(1); i <= n; ++i) d[i] = pri[i], cnt[i] = 1;
	for (int i(1); i <= n; ++i) {
		int mink(0);
		for (int j(1); j <= n; ++j) 
			if (!vis[j] && d[mink] > d[j]) mink = j;
		if (mink == 1) return !printf("%lld %lld", d[1], cnt[1]);
		vis[mink] = 1; int len(g[mink].size());
		for (int j(0); j < len; ++j) {
            int t1(g[mink][j].first), t2(g[mink][j].second), t(d[mink] + d[t1]);
            if (vis[t1] && !vis[t2]) {
                if (d[t2] > t) d[t2] = t, cnt[t2] = cnt[t1] * cnt[mink];
                else if (d[t2] == t) cnt[t2] += cnt[t1] * cnt[mink];
            }
        }
			
	}
	return 0;
}

邻接矩阵存图

#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int init() {
	char c;
	while (!isdigit(c = getchar())) if (c == EOF) return EOF;
	int x(c ^ 48);
	while (isdigit(c = getchar())) x = x * 10 + (c ^ 48);
	return x;
}
int n, d[1005], cnt[1005], g[1005][1005];
bool vis[1005];
signed main() {
	n = init();
	for (int i(1); i <= n; ++i) d[i] = init(), cnt[i] = 1;
	for (int a, b, c; ~(a = init(), b = init(), c = init()); )
		++a, ++b, ++c, g[a][b] = g[b][a] = c;
	d[0] = 1e18;
	for (int i(1); i <= n; ++i) {
		int mink(0);
		for (int j(1); j <= n; ++j) 
			if (!vis[j] && d[mink] > d[j]) mink = j;
		if (mink == 1) return !printf("%lld %lld", d[1], cnt[1]);
		vis[mink] = 1; 
		for (int j(1); j <= n; ++j)
			if (vis[j] && g[mink][j]) {
				int t(d[mink] + d[j]), &dis(d[g[mink][j]]);
				if (dis == t) cnt[g[mink][j]] += cnt[mink] * cnt[j];
				else if (dis > t) dis = t, cnt[g[mink][j]] = cnt[mink] * cnt[j];
			}
			
	}
	return 0;
}

劳驾各位大佬了

2022/2/27 10:34
加载中...