建个图,跑两个bfs算下距离,假如不是因为这条边的产生使得距离变短了,就ans++.n^2枚举添加的边.
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+5;
vector<int>v[N];
map<int,int>mp[N];
int dis1[N],dis2[N],vis1[N],vis2[N];//dis1是所有点到s的最短距离 dis2是所有点到t的最短距离
queue<int>q1,q2;
void bfs1()//处理dis1.
{
while(q1.size())
{
int temp=q1.front();
q1.pop();
for(int i=0;i<v[temp].size();i++)
{
int pos=v[temp][i];
if(vis1[pos]) continue;
vis1[pos]=1;
dis1[pos]=dis1[temp]+1;
q1.push(pos);
}
}
}
void bfs2()//处理dis2.
{
while(q2.size())
{
int temp=q2.front();
q2.pop();
for(int i=0;i<v[temp].size();i++)
{
int pos=v[temp][i];
if(vis2[pos]) continue;
vis2[pos]=1;
dis2[pos]=dis2[temp]+1;
q2.push(pos);
}
}
}
int main()
{
int n,m,s,t,ans=0;
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i=0;i<m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
mp[x][y]=1;mp[y][x]=1;
}
q1.push(s);vis1[s]=1;
bfs1();
q2.push(t);vis2[t]=1;
bfs2();
//cout<<dis1[t]<<' '<<dis2[2]<<endl;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(mp[i][j]) continue;
if(dis1[i]+dis2[j]+1>=dis2[s]&&dis1[j]+dis2[i]+1>=dis2[s]) ans++;
}
}
printf("%d\n",ans);
return 0;
}

京公网安备 11010502036488号