卡了2个点,求助。问题在图里
查看原帖
卡了2个点,求助。问题在图里
1016832
Lertoli楼主2023/10/18 21:32

出现的问题在图里

#include<bits/stdc++.h>
using namespace std;

int n,m,x,y,s1,t1,s2,t2,ans=0;
int k[3010][3010];

int bfs(int x)
{
	queue <int> q;
	bool g[3010]={};//g是用来判断去没去过某个城市。 
	int d[3010]={};//d是写入某一点的上一点是哪。如3->6,那d[6]=3; 
	q.push(1);
	g[1]=true;
	d[1]=0;
	while(!q.empty())
	{
		if(q.front()==x)
		{
			int t=0,tt=x;
			while(tt!=1)
			{
				k[min(tt,d[tt])][max(tt,d[tt])]++;//走过的路k++就大于1了。 
				tt=d[tt];
				t++;
			}
			return t;
		}
		for(int i=1;i<=n;i++)
		{
			if(k[min(q.front(),i)][max(q.front(),i)]&&!g[i])
			{
				q.push(i);
				d[i]=q.front();//记录d[i]的上一点。也是这里出的问题。 
				g[i]=true;
			}
		}
		q.pop();
	}
	return -1;
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    { 
    	scanf("%d%d",&x,&y);
    	if(x==y) continue;//自环不计 
		else if(k[min(x,y)][max(x,y)]==1) continue; //重复不计
		else k[min(x,y)][max(x,y)]=1;  //我这里为了方便,不统计重复和自环的路。 
	}                                  //这里记小数到大数。 
	scanf("%d%d%d%d",&s1,&t1,&s2,&t2);
	int k1=bfs(s1),k2=bfs(s2);
	if(k1==-1||k2==-1||k1>t1||k2>t2)
	{
		printf("-1");
	}
	else
	{
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				if(k[i][j]>1) ans++; //去过的路他的值一定大于1
		printf("%d",m-ans);          //那去掉的路就为m-ans了 
	}
	return 0;
}

2023/10/18 21:32
加载中...