D. Fight Against Traffic-(最短路径spfa)

总结

跑两次spfa,然后暴力查询增加新边满足条件的方案数

自己的问题

1:写bfs的标记时候,没处理好,每次入队列的,标记一次,避免重复
2:添加新边的时候,算最短路径有一段路径算重复了。

const int N=1e3+5;
int dis[N],vis[N],dist[N];
vector<int>G[N];
void spfa(int a[],int s)
{
    memset(vis,0);
    queue<int>que;
    que.push(s);
    vis[s]=true;
    while(!que.empty())
    {
        int x=que.front();
        que.pop();
        for(int i=0;i<G[x].size();i++)
        {
            if(vis[G[x][i]])
                continue;
            a[G[x][i]]=a[x]+1;
            que.push(G[x][i]);
            vis[G[x][i]]=true;
        }
    }
}
signed main()
{
    IOS;
    //file();
    int n,m,s,t;
    cin>>n>>m>>s>>t;
    set<pair<int,int> >se;
    for(int i=0;i<m;i++)
    {
        int x,y;
        cin>>x>>y;
        G[x].pb(y);
        G[y].pb(x);
        se.insert(mp(min(x,y),max(x,y)));
    }
    spfa(dis,s);
    spfa(dist,t);
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            if(min(dis[i]+dist[j],dis[j]+dist[i])+1>=dis[t]&&se.count(mp(i,j))==0)
                ans++;
        }
    }
    cout<<ans<<endl;
    return 0;
}
发布了130 篇原创文章 · 获赞 5 · 访问量 4988

猜你喜欢

转载自blog.csdn.net/weixin_44224825/article/details/104284054