刚学OI的萌新不是很理解
查看原帖
刚学OI的萌新不是很理解
241817
Chancylaser楼主2024/11/5 08:37

以下的代码Wa 1,6。

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef long long LL;
const int N=3e3+5, INF=9e18;

int n;
int dis[N],f[N];
int pos[N][N];
bool vis[N];
int bk[N][N];

signed main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&dis[i]);
		f[i]=1;
	}
	
	int a,b,c;
	while(scanf("%lld%lld%lld",&a,&b,&c)!=EOF){
		a++; b++; c++;
		pos[a][b]=c;
		pos[b][a]=c;
	}
	
	for(int t=1;t<=n;t++){
		int sum=INF, nw=0;
		for(int i=1;i<=n;i++)
			if(!vis[i] && dis[i]<sum){
				sum=dis[i];
				nw=i;
			}
		vis[nw]=1;
		for(int i=1;i<=n;i++){
			if(pos[i][nw]){
				int j=pos[i][nw];
				if(dis[j]>dis[nw]+dis[i]){
					dis[j]=dis[nw]+dis[i];
					f[j]=f[nw]*f[i];
				}
				else if(dis[j]==dis[nw]+dis[i]){
					if(bk[i][nw] == dis[j]) continue;
					f[j]+=f[nw]*f[i];
				}
				bk[i][nw]=bk[nw][i]=dis[j]; 
			}
		}
	}
	
	printf("%lld %lld",dis[1],f[1]);
	return 0;
}

但是我只要在代码中的 if(pos[i][nw]) 变为 if(pos[i][nw] && vis[i]) 就能AC,求问为什么/kel

2024/11/5 08:37
加载中...