关于C++压行中逗号连接语句的执行顺序的问题
查看原帖
关于C++压行中逗号连接语句的执行顺序的问题
443649
NATO楼主2022/7/25 16:18

两份代码:

提交记录1

#include<bits/stdc++.h>
#define ll long long
#define il inline
#define re register
using namespace std;
ll n,m,sum,l,head[100005],d_to1[100005],id[100005],point[100005],d_ton[100005],to[100005];
bool vis[100005],minv[100005],minev[100005];
struct px
{
	ll id,dis;
	bool operator <(const px&b)const
	{
		return dis>b.dis;
	}
};
priority_queue<px>a;
il void insert(ll id,ll dis)
{
	px t;
	t.dis=dis;t.id=id;
	a.push(t);
}
queue<ll>k;
struct ed
{
	ll u,v,w,next;
}edge[200005];
il void add(ll u,ll v,ll w)
{
	edge[++sum].v=v;
	edge[sum].w=w;
	edge[sum].u=u;
	edge[sum].next=head[u];
	head[u]=sum;
}
il void sp(ll s)
{
	memset(vis,0,sizeof(vis));
	vis[s]=1;
	k.push(s);
	while(!k.empty())
	{
		ll u=k.front();k.pop();vis[u]=0;
		for(re ll i=head[u];i;i=edge[i].next)
		{
			ll v=edge[i].v,w=edge[i].w;
			if(!minev[i]&&d_to1[u]+w<d_to1[v])
			{
				d_to1[v]=d_to1[u]+w;
				if(minv[v])
					insert(to[v],d_to1[v]+d_ton[to[v]]);
				else if(!vis[v])
				{
					vis[v]=1;
					k.push(v);
				}
			}
		}
	}
}
int main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m>>l;
	ll u,v,w;
	memset(d_to1,127,sizeof(d_to1));d_to1[1]=0;
	for(re ll i=1;i<=m;++i)
		cin>>u>>v>>w,add(u,v,w);
	for(re ll i=1;i<=l;++i)
		cin>>id[i],point[i+1]=edge[id[i]].v,minv[point[i+1]]=1,minev[id[i]]=1,to[point[i+1]]=i+1;
	point[1]=1;
	for(re ll i=l;i>0;--i)
		d_ton[i]=d_ton[i+1]+edge[id[i]].w;
	sp(1);
	for(re ll i=1;i<=l;++i)
	{
		while(!a.empty()&&a.top().id<=i)	a.pop();
		cout<<((!a.empty())?a.top().dis:-1)<<'\n';
		d_to1[edge[id[i]].v]=d_to1[edge[id[i]].u]+edge[id[i]].w;
		sp(edge[id[i]].v);
	}
}

提交记录2

#include<bits/stdc++.h>
#define ll long long
#define il inline
#define re register
using namespace std;
ll n,m,sum,l,head[100005],d_to1[100005],id[100005],point[100005],d_ton[100005],to[100005];
bool vis[100005],minv[100005],minev[100005];
struct px
{
	ll id,dis;
	bool operator <(const px&b)const
	{
		return dis>b.dis;
	}
};
priority_queue<px>a;
il void insert(ll id,ll dis)
{
	px t;
	t.dis=dis;t.id=id;
	a.push(t);
}
queue<ll>k;
struct ed
{
	ll u,v,w,next;
}edge[200005];
il void add(ll u,ll v,ll w)
{
	edge[++sum].v=v;
	edge[sum].w=w;
	edge[sum].u=u;
	edge[sum].next=head[u];
	head[u]=sum;
}
il void sp(ll s)
{
	memset(vis,0,sizeof(vis));
	vis[s]=1;
	k.push(s);
	while(!k.empty())
	{
		ll u=k.front();k.pop();vis[u]=0;
		for(re ll i=head[u];i;i=edge[i].next)
		{
			ll v=edge[i].v,w=edge[i].w;
			if(!minev[i]&&d_to1[u]+w<d_to1[v])
			{
				d_to1[v]=d_to1[u]+w;
				if(minv[v])
					insert(to[v],d_to1[v]+d_ton[to[v]]);
				else if(!vis[v])
				{
					vis[v]=1;
					k.push(v);
				}
			}
		}
	}
}
int main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m>>l;
	ll u,v,w;
	memset(d_to1,127,sizeof(d_to1));d_to1[1]=0;
	for(re ll i=1;i<=m;++i)
		cin>>u>>v>>w,add(u,v,w);
	for(re ll i=1;i<=l;++i)
		cin>>id[i],point[i+1]=edge[id[i]].v,minev[id[i]]=1,to[point[i+1]]=i+1,minv[point[i+1]]=1;//改变的位置
	point[1]=1;
	for(re ll i=l;i>0;--i)
		d_ton[i]=d_ton[i+1]+edge[id[i]].w;
	sp(1);
	for(re ll i=1;i<=l;++i)
	{
		while(!a.empty()&&a.top().id<=i)	a.pop();
		cout<<((!a.empty())?a.top().dis:-1)<<'\n';
		d_to1[edge[id[i]].v]=d_to1[edge[id[i]].u]+edge[id[i]].w;
		sp(edge[id[i]].v);
	}
}

RT,本蒟蒻在改变数组 minv 的赋值在逗号中的顺序后(并没有改变赋值中调用的数组 point 与该数组的相对赋值顺序)就过了,怀疑是逗号导致的问题,求大佬讲解。

2022/7/25 16:18
加载中...