这题呢就是从1点开始用最短路求哪些点是需要的,然后数出不需要的点的个数思路很简单,相信大家的智商可以理解
#include <bits/stdc++.h>
using namespace std;
const int N=3010;
int n,m,s1,t1,s2,t2,dis[N],ct,pre[N];
bool g[N][N],wdt[N],ans[N][N];
bool Dijkstra(int s,int t) {
memset(pre,0,sizeof pre);
memset(dis,0x3f,sizeof dis);
dis[1]=0;
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++) {
if (g[i][j] && i==1) dis[j]=pre[j]=1;
if (g[i][j] && j==1) dis[i]=pre[i]=1;
}
memset(wdt,false,sizeof wdt);
wdt[1]=true;
for (int i=1; i<n; i++) {
int mi=0x3f3f3f3f,p;
for (int j=1; j<=n; j++) {
if (wdt[j]) continue;
if (mi>dis[j]) {
mi=dis[j];
p=j;
// printf("%d ",p);
}
}
// printf("%d ",p);
wdt[p]=true;
if (p==s) {
if (dis[s]>t) return false;
else return true;
}
for (int j=1; j<=n; j++) {
if (wdt[j] || !g[p][j]) continue;
// puts("AAA");
if (dis[j]>dis[p]+1) {
dis[j]=dis[p]+1;
pre[j]=p;
// printf("```%d %d\n",j,dis[j]);
}
}
}
if (dis[s]>t) return false;
else return true;
}
void pr(int d) {
if (d==1) return;
ans[d][pre[d]]=ans[pre[d]][d]=true;
pr(pre[d]);
}
int main() {
// freopen("1.in","r",stdin);
scanf("%d%d",&n,&m);
for (int i=1,x,y; i<=m; i++) {
scanf("%d%d",&x,&y);
g[x][y]=g[y][x]=true;
}
scanf("%d%d%d%d",&s1,&t1,&s2,&t2);
if (!Dijkstra(s1,t1)) {
printf("-1");
return 0;
}
// puts("AAA");
pr(s1);
// puts("---");
if (!Dijkstra(s2,t2)) {
printf("-1");
return 0;
}
pr(s2);
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
if (ans[i][j]) ct++;//,printf("%d %d\n",i,j);
printf("%d",m-(ct>>1));
return 0;
}
第1次写,希望能够通过