社区讨论
萌新刚学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 条回复,欢迎继续交流。
正在加载回复...