87分求调,急
查看原帖
87分求调,急
952033
lutaoquan2012楼主2023/12/13 18:45
//
// Created by 55062 on 2023/12/13.
//
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Gra{
    ll v;
};
vector<Gra> adj[1010];
vector<Gra> Adj[1010];
struct D{
    ll end;
};
queue<D> q;
queue<D> qq;
ll dis[1010],v[1010],d[1010],vis[1010],ans,a[1010][1010],n,m,s,t,u,vv;
int main(){
    cin>>n>>m>>s>>t;
    for(int i=1;i<=m;i++){
        cin>>u>>vv;
        adj[u].push_back({vv});//建图
        Adj[vv].push_back({u});//反向建图
        a[u][vv]=1;//邻接矩阵
        a[vv][u]=1;//无向图
    }
    memset(dis,0x3f,sizeof(dis));
    memset(d,0x3f,sizeof(d));
    dis[s]=0;
    q.push({s});
    while(!q.empty()){
        ll x=q.front().end;
        q.pop();
        if(v[x]==1) continue;//如果是秀,这接跳过
        v[x]=1;//标记为秀
        for(int i=0;i<adj[x].size();i++){
            ll nx=adj[x][i].v;
            if(v[nx]==0){//不是秀
                if(dis[x]+1<dis[nx]){//如果上一个秀再加上1比当前的秀好,那么更新
                    dis[nx]=dis[x]+1;//更新
                    q.push({nx});//入队
                }
            }
        }
    }//同样方法,反向建图
    d[t]=0;
    qq.push({t});
    while(!qq.empty()){
        ll x=qq.front().end;
        qq.pop();
        if(vis[x]==1) continue;//如果是秀,这接跳过
        vis[x]=1;//标记为秀
        for(int i=0;i<Adj[x].size();i++){
            ll nx=Adj[x][i].v;
            if(vis[nx]==0){//不是秀
                if(d[x]+1<d[nx]){//如果上一个秀再加上1比当前的秀好,那么更新
                    d[nx]=d[x]+1;//更新
                    qq.push({nx});//入队
                }
            }
        }
    }
    for(int i=1;i<n;i++)
        for(int j=i+1;j<=n;j++)
            if(min(dis[j]+d[i]+1,dis[i]+d[j]+1)>=dis[t]&&a[i][j]!=1) ans++;//如果加一条边对答案没有影响,那么方案数+1
    cout<<ans;
    return 0;
}
2023/12/13 18:45
加载中...