社区讨论

萌新刚学OI,SPFA,错#6

P1992不想兜圈的老爷爷参与者 3已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lo8bjzpr
此快照首次捕获于
2023/10/27 15:56
2 年前
此快照最后确认于
2023/10/27 15:56
2 年前
查看原帖
C
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define mode 9997
#define ll long long 
using namespace std;
queue<int> q;
int n,m,h[200100],x,y,l,dis[200100],vis[200100],c[200100];
ll k;
struct edge
{
	int v,w,next;
}e[800100];
inline ll quick_pow(int x,ll y)
{
	if(y==0) return 1;
	if(y==1) return x;
	ll t=quick_pow(x,y>>1)%mode;
	if(y&1) return t*t%mode*x%mode;
	else return t*t%mode;
}
inline int read()
{
	int k=0,f=0;char c=getchar();
	for(;!isdigit(c);c=getchar()) f|=c=='-';
	for(;isdigit(c);c=getchar()) k=(k<<1)+(k<<3)+(c^48);
	return f?-k:k;
}
inline void add(int x,int y,int z)
{
	e[++l].v=y;
	e[l].w=z;
	e[l].next=h[x];
	h[x]=l;
}
inline int spfa(int st)
{
	for(int i=1;i<=n;i++) dis[i]=inf;
	dis[st]=0;
	q.push(st);
    vis[st]=1;
    c[st]++;
	while(!q.empty())
	{
		int k=q.front();
		q.pop();
		vis[k]=0;
		for(int i=h[k];i;i=e[i].next)
		{
			if(dis[e[i].v]>dis[k]+e[i].w)
			{
				dis[e[i].v]=dis[k]+e[i].w;
				if(!vis[e[i].v])
				{
					c[e[i].v]++;
					q.push(e[i].v);
					vis[e[i].v]=1;
					if(c[e[i].v]>n) return 1;
				}
			}
		}
	}
	return 0;
}
int main()
{
	n=read(),m=read();
	scanf("%lld",&k);
	for(int i=1;i<=m;i++)
	{
		x=read(),y=read();
		add(x,y,-1);
	}
	if(spfa(1)) printf("No\n%lld",k*k);
	else printf("Yes\n%lld",quick_pow(2,k));
	return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...