100分求调,最后一个点TLE
查看原帖
100分求调,最后一个点TLE
802297
hblhuangbolun楼主2024/8/7 18:19
#include <vector>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#define ll long long
#define mo 100003
using namespace std;
const ll M=1e6+10;
ll n,m,s,cnt,dis[M],vis[M],head[M],num[M];
struct node 
{
	int d,x;
	bool operator < (const node& a) const 
	{
		return a.d<d;
	}
};
priority_queue<node>q;
struct edge 
{
	ll to,from,v;
} e[M*4];
void insert(ll x,ll y,ll z) 
{
	e[++cnt].to=y;
	e[cnt].from=head[x];
	head[x]=cnt;
	e[cnt].v=z;
	e[++cnt].to=x;
	e[cnt].from=head[y];
	head[y]=cnt;
	e[cnt].v=z;
}
void dij(ll x) 
{
	memset(dis,127,sizeof(dis));
	memset(vis,0,sizeof(vis));
	while (!q.empty()) 
	{
		q.pop();
	}
	q.push(node {0,x});
	dis[x]=0;
	vis[x]=1;
	num[x]=1;
	while (!q.empty()) 
	{
		ll u=q.top().x;
		q.pop();
		for (ll i=head[u]; i; i=e[i].from)
		{
			if (dis[e[i].to]>dis[u]+e[i].v) 
			{
				dis[e[i].to]=dis[u]+e[i].v;
				num[e[i].to]=num[u];
				if (!vis[e[i].to])	
				{
					vis[e[i].to]=1;
					q.push(node{dis[e[i].to],e[i].to});
				}
			} 
			else 
			{
				if (dis[e[i].to]==dis[u]+e[i].v)
				{
					num[e[i].to]=(num[e[i].to]+num[u])%mo;
				}
			}
			vis[u]=0;
		}
	}
	for (ll i=1; i<=n; i++) cout<<num[i]<<endl;
}
int main() {
	scanf("%lld%lld",&n,&m);
	for (ll i=1,x,y,z; i<=m; i++) 
	{
		cin>>x>>y;
		insert(x,y,1);
	}
	dij(1);
}
2024/8/7 18:19
加载中...