错误假设+正确推理=错误结论

1.使用memset初始化一定要慎重,一般只用来初始化0、-1、0x3f这几个数字,其他的建议使用循环初始化,其他值尽量用for循环吧。
2.作为无穷大,一个数除了要保证足够大外,还要保证不能溢出。
使用0x3f3f3f3f作为INF主要原因是,两个0x3f3f3f3f的和只比int类型的最大值小一点,这样既能保证一般情况下的足够大,在两个无穷相加时还能够保证不会溢出

++ primer中sizeof 的解释如下:

1.对char或值为char类型的表达式做sizeof操作得1

2.对引用类型做操作返回存放引用的对象所需的内存空间大小

3.对指针做sizeof操作将返回存放指针所需内存空间的大小;注意如果要获取存放改指针所指向的对象的大小,则必须对该指针进行解引用。

4.对数组做sizeof操作等效于对元素类型做sizeof的结果呈上数组的大小(退化成指针)

#include<bits/stdc++.h>
using namespace std;
int n,m,s,t;
bool pa[1010][1010];
int d1[1010],d2[1010];
int q[1010];
void bfs(int s,int *num)
{
	memset(num,0x3f,1010*4);
	int tt=-1,ww=0;
	q[0]=s,num[s]=0;
	while(tt<ww)
	{
		int x=q[++tt];
		for(int i=1;i<=n;++i)
		{
			if(pa[x][i]&&num[i]==0x3f3f3f3f)
			{
				num[i]=num[x]+1;//能连的直接连,没连的 bfs递进过程保证了从小到大的最小性,
				q[++ww]=i;//省去初始化 
			}
		}
	}
}
int main ()
{
	int a=0;
	cin>>n>>m>>s>>t;
	for(int i=1;i<=m;++i)
	{
		int u,v;
		cin>>u>>v;
		
		pa[u][v]=pa[v][u]=true;
	}
	bfs(s,d1);
	bfs(t,d2);
	for(int i=1;i<=n;++i)
	for(int j=i+1;j<=n;++j)
	{
		if(pa[i][j])
		continue;
		else {
			if(d1[i]+d2[j]+1>=d1[t]&&d1[j]+d2[i]+1>=d2[s])//bfs复杂度高,加一条边只要单独考虑这条边可能产生的影响即可 
			a++;
		}
	}
	cout<<a;
	
}

区别最短路和bfs,前者有长度,后者相当于长度为1,后者只要能到就到是最短,前者因为距离不同产生需要比较

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值