蒟蒻求助,为什么这题别人不用高精也能过?
查看原帖
蒟蒻求助,为什么这题别人不用高精也能过?
367296
cjwen楼主2022/3/3 20:27

为什么这题别人不用高精也能过?而我不能。

我的代码如下:

https://www.luogu.com.cn/record/70494547

#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>

using namespace std;

const int N = 1e3 + 10;

int n;
int a, b, c;
long long dis[N];
long long ans[N];
bool v[N];

struct edge{
	int to;
	int w;
};

vector <edge> g[N];

pair <long long, int> t; 

priority_queue <pair<long long, int>, vector<pair<long long, int> >, greater<pair<long long, int> > > q;

int main(){
	
	scanf("%d", &n);
	
	for(int i = 0; i < n; i++){
		scanf("%lld", &dis[i]);
		ans[i] = 1;
		q.push(make_pair(dis[i], i));
	}
	
	while(scanf("%d%d%d", &a, &b, &c) != EOF){
		g[a].push_back({c, b});
		if(a != b){
			g[b].push_back({c, a});
		}
	}
	
	while(!q.empty()){
		t = q.top();
		q.pop();
		
		if(v[t.second]){
			continue;
		}
		
		v[t.second] = 1;
		
		for(auto i : g[t.second]){
			if(v[i.w]){
				if(t.first + dis[i.w] == dis[i.to]){
					ans[i.to] += ans[t.second] * ans[i.w];
				}else{
					if(t.first + dis[i.w] < dis[i.to]){
						dis[i.to] = t.first + dis[i.w];
						ans[i.to] = ans[t.second] * ans[i.w];
						q.push(make_pair(dis[i.to], i.to));
					}
				}
			}
		}
	}
	
	printf("%lld %lld\n", dis[0], ans[0]);
	
	return 0;
}

别人的代码如下:

https://www.luogu.com.cn/record/70192773

#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;
}

最后一组数据应该是这里来的:https://www.luogu.com.cn/discuss/412640

但是我在自己电脑上测了这组 hack 数据,两种做法均不能通过。

请问为什么别人的没高精过了(现在交也还是AC),我的不行(Unaccepted 100 )

2022/3/3 20:27
加载中...