迪杰斯特拉最短路玄学90分WA哪里错了QWQ
查看原帖
迪杰斯特拉最短路玄学90分WA哪里错了QWQ
744354
Wil_Lei楼主2022/8/23 10:41

我的思路

这题呢就是从1点开始用最短路求哪些点是需要的,然后数出不需要的点的个数思路很简单,相信大家的智商可以理解

WA的代码

#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次写,希望能够通过

2022/8/23 10:41
加载中...