关于此题
查看原帖
关于此题
120947
PurslaneM2GA楼主2022/4/4 18:23

为什么 vector 存图会 Wa 最后一个点 ? 请大佬给出一个合理的解释 .

AC :

#include<bits/stdc++.h>
#define int long long
#define ffor(i,a,b) for(int i=(a);i<=(b);i++)
#define roff(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int MAXN=1000+10;
int n,vis[MAXN],w[MAXN],dp[MAXN],dis[MAXN];
struct Node {
	int u,dis;
};
bool operator <(Node a,Node b) {
	return a.dis>b.dis;
}
priority_queue<Node> q;
int flg[MAXN][MAXN];
void output(int v) {
	if(v>=10) output(v/10);
	cout<<v%10;
}
int read() {
	long long v;cin>>v;return v;
}
signed main() {
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	n=read();
	ffor(i,1,n) w[i]=read();ffor(i,1,n) dis[i]=w[i],dp[i]=1;
	long long A,B,C;
	while(cin>>A>>B>>C) {
		A++,B++,C++;
		flg[A][B]=flg[B][A]=C;
	}
	ffor(i,1,n) q.push({i,dis[i]});
	while(!q.empty()) {
		int u=q.top().u;
		q.pop();
		if(vis[u]) continue;vis[u]=1;
		for(int i=1;i<=n;i++) if(flg[u][i]) {
			int v=i,to=flg[u][i];
			if(!vis[v]) continue;
			if(dis[to]>dis[v]+dis[u]) dis[to]=dis[v]+dis[u],dp[to]=dp[v]*dp[u],q.push({to,dis[to]});
			else if(dis[to]==dis[v]+dis[u]) dp[to]+=dp[v]*dp[u];
		}
	}
	output(dis[1]);cout<<' ';output(dp[1]);
	return 0;
}

WA :

#include<bits/stdc++.h>
#define int long long
#define ffor(i,a,b) for(int i=(a);i<=(b);i++)
#define roff(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int MAXN=1000+10;
int n,vis[MAXN],w[MAXN],dp[MAXN],dis[MAXN];
struct Node {
	int u,dis;
};
bool operator <(Node a,Node b) {
	return a.dis>b.dis;
}
priority_queue<Node> q;
vector<pair<int,int> >vc[MAXN];
void output(int v) {
	if(v>=10) output(v/10);
	cout<<v%10;
}
int read() {
	long long v;cin>>v;return v;
}
signed main() {
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	n=read();
	ffor(i,1,n) w[i]=read();ffor(i,1,n) dis[i]=w[i],dp[i]=1;
	long long A,B,C;
	while(cin>>A>>B>>C) {
		A++,B++,C++;
		if(A!=B) vc[A].push_back({B,C}),vc[B].push_back({A,C});
		else vc[A].push_back({B,C});
	}
	ffor(i,1,n) q.push({i,dis[i]});
	while(!q.empty()) {
		int u=q.top().u;
		q.pop();
		if(vis[u]) continue;vis[u]=1;
		for(auto pr:vc[u]) {
			int v=pr.first,to=pr.second;
			if(!vis[v]) continue;
			if(dis[to]>dis[v]+dis[u]) dis[to]=dis[v]+dis[u],dp[to]=dp[v]*dp[u],q.push({to,dis[to]});
			else if(dis[to]==dis[v]+dis[u]) dp[to]+=dp[v]*dp[u];
		}
	}
	output(dis[1]);cout<<' ';output(dp[1]);
	return 0;
}
2022/4/4 18:23
加载中...