我把
for(auto i:e){
int ix=pos[i.x],iy=pos[i.y];
ans=min(ans,i.wgh+min(dis[ix][x]+dis[iy][y],dis[ix][y]+dis[iy][x]));
}
cout<<ans<<"\n";
}
改成
for(auto i:v){
int id=pos[i];ans=min(ans,dis[id][x]+dis[id][y]);
}
就就对了
这是AC的
#include<bits/stdc++.h>
#define db double
#define int long long
#define ull unsigned long long
#define pb push_back
#define MP make_pair
#define fi first
#define se second
#define pii pair<int, int>
#define ls k<<1
#define rs k<<1|1
using namespace std;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline void write(int x){
if(x<0){putchar('-');x=-x;}
if(x>9)write(x/10);
putchar(x%10+'0');
}
const int N=1e5+5;
int n,m,q,fa[N],sz[N],vis[N],dp[N][22],s[N],dis[50][N],pos[N],d[N],tot;
int cnt,to[N<<1],w[N<<1],nxt[N<<1],first[N];
void add(int x,int y,int wgh){to[++cnt]=y;w[cnt]=wgh;nxt[cnt]=first[x];first[x]=cnt;}
struct edge{
int x,y,wgh;
bool operator <(const edge& b)const
{
return wgh<b.wgh;
}
}E[N];
vector<pii>G[N];
set<edge>e;
set<int>v;
struct node{
int x,s;
bool operator <(const node& b)const
{
return s>b.s;
}
};
int find(int k){return fa[k]==k?k:fa[k]=find(fa[k]);}
void merge(int x,int y){
x=find(x);y=find(y);if(x==y)return ;
if(sz[x]>sz[y])swap(x,y);
fa[x]=y;sz[y]+=sz[x];
}
void dfs(int x,int fa){
vis[x]=1;d[x]=d[fa]+1;
dp[x][0]=fa;for(int i=1;i<=20;i++)dp[x][i]=dp[dp[x][i-1]][i-1];
for(int i=first[x];i;i=nxt[i]){
int y=to[i];if(y==fa)continue;
s[y]=s[x]+w[i];
dfs(y,x);
}
}
int LCA(int a,int b){
if(d[a]>d[b])swap(a,b);
for(int i=20;i>=0;i--)if(d[a]<=d[dp[b][i]])b=dp[b][i];
if(a==b)return a;
for(int i=20;i>=0;i--)if(dp[a][i]!=dp[b][i])a=dp[a][i],b=dp[b][i];
return dp[a][0];
}
void dijkstra(int s,int id){
memset(dis[id],0x7f,sizeof dis[id]);dis[id][s]=0;
memset(vis,0,sizeof vis);
priority_queue<node>q;q.push({s,0});
while(!q.empty()){
int x=q.top().x;q.pop();
if(vis[x])continue;vis[x]=1;
for(auto cur:G[x]){
int y=cur.fi,wgh=cur.se;
if(dis[id][y]>dis[id][x]+wgh){
dis[id][y]=dis[id][x]+wgh;
q.push({y,dis[id][y]});
}
}
}
}
signed main(){
freopen("read.in","r",stdin);
// freopen(".out","w",stdout);
n=read();m=read();
for(int i=1;i<=n;i++)fa[i]=i,sz[i]=1;
for(int i=1;i<=m;i++){
int x=read(),y=read(),d=read();
E[i]={x,y,d};G[x].pb(MP(y,d));G[y].pb(MP(x,d));
}
sort(E+1,E+1+m);
for(int i=1;i<=m;i++){
if(find(E[i].x)!=find(E[i].y)){
merge(E[i].x,E[i].y);
add(E[i].x,E[i].y,E[i].wgh);add(E[i].y,E[i].x,E[i].wgh);
}
else e.insert(E[i]),v.insert(E[i].x),v.insert(E[i].y);
}
for(int i=1;i<=n;i++)if(!vis[i])dfs(i,0);
for(auto i:v)pos[i]=++tot,dijkstra(i,tot);
//for(auto i:v){for(int j=1;j<=n;j++)cout<<dis[pos[i]][j]<<' ';cout<<"\n";}
q=read();
while(q--){
int x=read(),y=read(),ans=s[x]+s[y]-2*s[LCA(x,y)];
for(auto i:v){
int id=pos[i];ans=min(ans,dis[id][x]+dis[id][y]);
}
cout<<ans<<"\n";
}
//printf("\nTIME:%lf\n",(double)clock()/CLOCKS_PER_SEC);
return 0;
}
而这个WA了
#include<bits/stdc++.h>
#define db double
#define int long long
#define ull unsigned long long
#define pb push_back
#define MP make_pair
#define fi first
#define se second
#define pii pair<int, int>
#define ls k<<1
#define rs k<<1|1
using namespace std;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline void write(int x){
if(x<0){putchar('-');x=-x;}
if(x>9)write(x/10);
putchar(x%10+'0');
}
const int N=1e5+1000;
int n,m,q,fa[N],sz[N],vis[N],dp[N][22],s[N],dis[50][N],pos[N],d[N],tot;
int cnt,to[N<<1],w[N<<1],nxt[N<<1],first[N];
void add(int x,int y,int wgh){to[++cnt]=y;w[cnt]=wgh;nxt[cnt]=first[x];first[x]=cnt;}
struct edge{
int x,y,wgh;
bool operator <(const edge& b)const
{
return wgh<b.wgh;
}
}E[N];
vector<pii>G[N];
set<edge>e;
set<int>v;
struct node{
int x,s;
bool operator <(const node& b)const
{
return s>b.s;
}
};
int find(int k){return fa[k]==k?k:fa[k]=find(fa[k]);}
void merge(int x,int y){
x=find(x);y=find(y);if(x==y)return ;
if(sz[x]>sz[y])swap(x,y);
fa[x]=y;sz[y]+=sz[x];
}
void dfs(int x,int fa){
vis[x]=1;d[x]=d[fa]+1;
dp[x][0]=fa;for(int i=1;i<=20;i++)dp[x][i]=dp[dp[x][i-1]][i-1];
for(int i=first[x];i;i=nxt[i]){
int y=to[i];if(y==fa)continue;
s[y]=s[x]+w[i];
dfs(y,x);
}
}
int LCA(int a,int b){
if(d[a]>d[b])swap(a,b);
for(int i=20;i>=0;i--)if(d[a]<=d[dp[b][i]])b=dp[b][i];
if(a==b)return a;
for(int i=20;i>=0;i--)if(dp[a][i]!=dp[b][i])a=dp[a][i],b=dp[b][i];
return dp[a][0];
}
void dijkstra(int s,int id){
memset(dis[id],0x7f,sizeof dis[id]);dis[id][s]=0;
memset(vis,0,sizeof vis);
priority_queue<node>q;q.push({s,0});
while(!q.empty()){
int x=q.top().x;q.pop();
if(vis[x])continue;vis[x]=1;
for(auto cur:G[x]){
int y=cur.fi,wgh=cur.se;
if(dis[id][y]>dis[id][x]+wgh){
dis[id][y]=dis[id][x]+wgh;
q.push({y,dis[id][y]});
}
}
}
}
signed main(){
// freopen("read.in","r",stdin);
// freopen(".out","w",stdout);
n=read();m=read();
for(int i=1;i<=n;i++)fa[i]=i,sz[i]=1;
for(int i=1;i<=m;i++){
int x=read(),y=read(),d=read();
E[i]={x,y,d};G[x].pb(MP(y,d));G[y].pb(MP(x,d));
}
sort(E+1,E+1+m);
for(int i=1;i<=m;i++){
if(find(E[i].x)!=find(E[i].y)){
merge(E[i].x,E[i].y);
add(E[i].x,E[i].y,E[i].wgh);add(E[i].y,E[i].x,E[i].wgh);
}
else e.insert(E[i]),v.insert(E[i].x),v.insert(E[i].y);
}
for(int i=1;i<=n;i++)if(!vis[i])dfs(i,0);
for(auto i:v)pos[i]=++tot,dijkstra(i,tot);
//for(auto i:v){for(int j=1;j<=n;j++)cout<<dis[pos[i]][j]<<' ';cout<<"\n";}
q=read();
while(q--){
int x=read(),y=read(),ans=s[x]+s[y]-2*s[LCA(x,y)];
for(auto i:e){
int ix=pos[i.x],iy=pos[i.y];
ans=min(ans,i.wgh+min(dis[ix][x]+dis[iy][y],dis[ix][y]+dis[iy][x]));
}
cout<<ans<<"\n";
}
//printf("\nTIME:%lf\n",(double)clock()/CLOCKS_PER_SEC);
return 0;
}