ABC G 题求条
  • 板块学术版
  • 楼主luogu_starblue
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/10/12 22:58
  • 上次更新2024/10/13 10:30:46
查看原帖
ABC G 题求条
1029048
luogu_starblue楼主2024/10/12 22:58

最后2个点死活过去不

#include<bits/stdc++.h>
#define int __int128
#define ll long long
using namespace std;
const int maxn=2e5+9;
struct node
{
	int v,w;
};
struct edge
{
	int u,v,w;
};
vector<node>G[maxn];
vector<edge>g;
void add(int u,int v,int w)
{
	G[u].push_back({v,w});
	G[v].push_back({u,w});
	g.push_back({u,v,w});
}
bool vis[maxn];
struct NODE
{
	int dis,u;
	bool operator<(const NODE &you)const
	{
		return dis>you.dis;
	}
};
int cnt1[maxn];
int dis1[maxn];
int disn[maxn];
int cntn[maxn];
ll n,m;
void dij(int s,int dis[],int cnt[])
{
	for(int i=1;i<=n;i++)dis[i]=1e18;
	memset(vis,false,sizeof(vis));
	cnt[s]=1;
	dis[s]=0;
	priority_queue<NODE>q;
	q.push({0,s});
	while(!q.empty())
	{
		int u=q.top().u;
		q.pop();
		if(vis[u])continue;
		vis[u]=true;
		for(auto it:G[u])
		{
			int v=it.v,w=it.w;
			if(dis[u]+w==dis[v])
			{
				cnt[v]+=cnt[u];
			}
			if(dis[u]+w<dis[v])
			{
				cnt[v]=cnt[u];
				dis[v]=dis[u]+w;
				q.push({dis[v],v});
			}
		}
	}	
}
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		ll u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
	}
	dij(1,dis1,cnt1);
	dij(n,disn,cntn);

//	for(int i=1;i<=n;i++)cout<<cnt1[i]<<" ";
//	cout<<endl;
	for(auto it:g)
	{
		int u=it.u,v=it.v,w=it.w;
		if(dis1[u]+w+disn[v]==dis1[n]&&cnt1[u]*cntn[v]==cnt1[n])
		{
			cout<<"Yes\n";
			continue;
		}
		swap(u,v);
		if(dis1[u]+w+disn[v]==dis1[n]&&cnt1[u]*cntn[v]==cnt1[n])
		{
			cout<<"Yes\n";
			continue;
		}
		cout<<"No\n";
	}	
	return 0;
}

2024/10/12 22:58
加载中...