直接枚举公共路径。。。。。注意细节(i->j,j->i)。。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define maxv 3050 #define maxe 6050 #define inf 2000000000 using namespace std; int n,m,x,y,s1,t1,l1,s2,t2,l2,dis[maxv][maxv],ans=inf,g[maxv],nume=0; bool vis[maxv]; queue <int> q; struct edge { int v,nxt; }e[maxe]; void addedge(int u,int v) { e[++nume].v=v; e[nume].nxt=g[u]; g[u]=nume; } void bfs(int x) { for (int i=1;i<=n;i++) {vis[i]=false;dis[x][i]=inf;} q.push(x);dis[x][x]=0;vis[x]=true; while (!q.empty()) { int head=q.front();q.pop(); for (int i=g[head];i;i=e[i].nxt) { int v=e[i].v; if (!vis[v]) { vis[v]=true;dis[x][v]=dis[x][head]+1; q.push(v); } } } } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) { scanf("%d%d",&x,&y); addedge(x,y);addedge(y,x); } scanf("%d%d%d",&s1,&t1,&l1); scanf("%d%d%d",&s2,&t2,&l2); for (int i=1;i<=n;i++) bfs(i); if ((dis[s1][t1]==inf) || (dis[s2][t2]==inf)) {printf("-1 ");return 0;} for (int i=1;i<=n;i++) for (int j=i;j<=n;j++) { if ((dis[s1][i]+dis[i][j]+dis[j][t1]<=l1) && (dis[s2][i]+dis[i][j]+dis[j][t2]<=l2)) ans=min(ans,dis[s1][i]+dis[s2][i]+dis[j][t1]+dis[j][t2]+dis[i][j]); if ((dis[s1][i]+dis[i][j]+dis[j][t1]<=l1) && (dis[s2][j]+dis[j][i]+dis[i][t2]<=l2)) ans=min(ans,dis[s1][i]+dis[s2][j]+dis[j][t1]+dis[i][t2]+dis[i][j]); if ((dis[s1][j]+dis[j][i]+dis[i][t1]<=l1) && (dis[s2][i]+dis[i][j]+dis[j][t2]<=l2)) ans=min(ans,dis[s1][j]+dis[s2][i]+dis[i][t1]+dis[j][t2]+dis[i][j]); if ((dis[s1][j]+dis[j][i]+dis[i][t1]<=l1) && (dis[s2][j]+dis[j][i]+dis[i][t2]<=l2)) ans=min(ans,dis[s1][j]+dis[s2][j]+dis[i][t1]+dis[i][t2]+dis[i][j]); } if ((dis[s1][t1]<=l1) && (dis[s2][t2]<=l2)) ans=min(ans,dis[s1][t1]+dis[s2][t2]); if (ans==inf) printf("-1 "); else printf("%d ",m-ans); return 0; }