总结
跑两次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;
}