T2
解析:
分两种情况:
(1)a-b,c-d 的路径不相交,则答案一定是 a-b,c-d 的最短路之和。
(2)a-b,c-d 的路径相交,则相交部分一定是连续的一段路径,于是
O
(
N
2
)
O(N^2)
O(N2)预处理每对点的最短路,
O
(
N
2
)
O(N^2)
O(N2)枚举相交的路径的两端,算一下总长就好了。以上两种情况所有方案取最小值即可。时间复杂度
O
(
N
2
)
O(N^2)
O(N2)。
代码:
#include <bits/stdc++.h>
using namespace std;
const int Max=3010;
int n,m,ans,s1,s2,t1,t2,size;
int vis[Max],f[Max][Max],first[Max];
struct shu{int to,next;}edge[Max<<1];
inline int get_int()
{
int x=0,f=1;char c;
for(c=getchar();(!isdigit(c))&&(c!='-');c=getchar());
if(c=='-') f=-1,c=getchar();
for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
return x*f;
}
inline void build(int x,int y)
{
edge[++size].next=first[x],first[x]=size,edge[size].to=y;
edge[++size].next=first[y],first[y]=size,edge[size].to=x;
}
inline void bfs(int s)
{
int head=0,tail=1;
for(int i=1;i<=n;i++) vis[i]=0;
queue<int>q;q.push(s);vis[s]=1;
while(q.size())
{
int p=q.front();q.pop();
for(int u=first[p];u;u=edge[u].next)
{
int to=edge[u].to;
if(vis[to]) continue;
vis[to]=1,f[s][to]=f[s][p]+1,q.push(to);
}
}
}
inline int calc(int id,int l,int r){return min(f[id][l],f[id][r]);}
int main()
{
n=get_int(),m=get_int(),s1=get_int(),t1=get_int(),s2=get_int(),t2=get_int();
for(int i=1;i<=m;i++)
{
int x=get_int(),y=get_int();
build(x,y);
}
for(int i=1;i<=n;i++) bfs(i);
ans=f[s1][t1]+f[s2][t2];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
ans=min(ans,calc(s1,i,j)+calc(t1,i,j)+calc(s2,i,j)+calc(t2,i,j)+f[i][j]);
cout<<ans;
return 0;
}