为什么 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;
}