90分,一个疑问。
查看原帖
90分,一个疑问。
128451
x_miracle楼主2020/10/2 23:15

差分约束不是有一个性质:

x=(x1,x2,x3,...,xn)x=\left( x_1,x_2,x_3,...,x_n\right)是不等式的一个解。设dd为任意常数,则x+d=(x1+d,x2+d,x3+d,...,xn+d)x+d=\left( x_1+d,x_2+d,x_3+d,...,x_n+d\right)也是该不等式的一个解。

基于这个性质。我用编号为 3 的数据对可行解进行检验。WA两个点。90分。

(之后看了题解,知道编号为 3 的数据应该怎么用了,但是这个疑问没有解决。)

#include <bits/stdc++.h>
#define MAXN 100000
#define INF 0x3f3f3f3f
using namespace std;
int cnt=0,adj[MAXN];
int n,m; 
int dis[MAXN],vis[MAXN],num[MAXN];
queue < int > q;
struct EDGE
{
	int to,nxt,val;
}	e[MAXN];
struct node 
{
	int x,y;
}	jud[MAXN]; int tot=1;
void addedge(int u,int v,int w)
{
	e[++cnt].to=v; e[cnt].nxt=adj[u]; e[cnt].val=w; adj[u]=cnt;
}
bool SPFA()
{
	for(int i=1;i<=n;++i)
	{
		addedge(0,i,0);dis[i]=INF;
	}
	q.push(0); dis[0]=0; vis[0]=1; ++num[0];
	while(!q.empty())
	{
		int u=q.front(); q.pop(); vis[u]=0;
		for(int i=adj[u];i;i=e[i].nxt)
		{
			int v=e[i].to;
			if(dis[v]>dis[u]+e[i].val)
			{
				dis[v]=dis[u]+e[i].val;
				if(!vis[v])
				{
					++num[v];
					if(num[v]>n) return 0;
					vis[v]=1; q.push(v);
				}
			}
		}
	}
	return 1;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;++i)
	{
		int flag,u,v,w; scanf("%d",&flag);
		if(flag==1)
		{
			scanf("%d%d%d",&u,&v,&w);
			addedge(u,v,-w);
		}
		else if(flag==2)
		{
			scanf("%d%d%d",&u,&v,&w);
			addedge(v,u,w);
		}	
		else
		{
			scanf("%d%d",&u,&v);
			jud[++tot].x=u;
			jud[tot].y=v;
		}
	}
	if(!SPFA())	printf("No");
	else
	{
		int i;
		for(i=1;i<=tot;++i)
			if(dis[ jud[i].x ] != dis[ jud[i].y ])
				break;
		if(i==tot+1)
			printf("Yes");
		else
			printf("NO");
	}
	return 0;
}

谢谢谢谢

2020/10/2 23:15
加载中...