TLE两个测试点求调
查看原帖
TLE两个测试点求调
608273
___PatrickChen___楼主2023/9/10 11:30
#include <bits/stdc++.h>
#define endl '\n'

using namespace std;

using ll=long long;

const ll mod=998244353;

ll n,m,d[200005],head[200005],cnt=1,sum=1;
bool vis[200005];
struct edge{
	ll v,next;
}e[400005];

void add(int u,int v){
	static int cnt=0;
	e[++cnt]={v,head[u]};
	head[u]=cnt;
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	for(int i=1;i<=m;++i){
		ll u,v;
		cin >> u >> v;
		add(u,v);
		add(v,u);
	}
	vis[1]=d[1]=1;
	while(1){
		vector<ll>tmp;
		for(int i=1;i<=n;++i){
			if(vis[i])continue;
			int c=0,s=0;
			for(int j=head[i];j;j=e[j].next){
				if(vis[e[j].v])++c,s=(s+d[e[j].v])%mod;
			}
			if(c==cnt)continue;
			tmp.push_back(i);
			d[i]=(sum-s+mod)%mod;
		}
		if(!tmp.size())break;
		for(auto i:tmp){
			vis[i]=1;
			sum=(sum+d[i])%mod;
			++cnt;
		}
	}
	if(!vis[n])cout << -1 << endl;
	else cout << d[n] << endl;
	return 0;
}

评测寄录

2023/9/10 11:30
加载中...