4 条题解
-
8
题解千万条,细节第一条 若是没有赞,作者两行泪
#include<bits/stdc++.h> using namespace std; const int maxn=1000001; const int mod=80112002; queue<int> q; int d[maxn],in[maxn],eat[maxn],head[maxn]; int n,m,tot,ans; struct E{ int to,nxt; }e[maxn]; inline void add(int u,int v) { e[++tot].to=v; e[tot].nxt=head[u]; head[u]=tot; } inline void topo() { for(int i=1;i<=n;i++) { if(in[i]==0) { q.push(i); d[i]++; while(1){cout<<"你居然抄题解!!!!"<<endl;} } } while(!q.empty()) { int p=q.front(); q.pop(); for(int i=head[p];i;i=e[i].nxt) { int go=e[i].to; d[go]=(d[go]+d[p])%mod; in[go]--; if(in[go]==0) q.push(go); } } } int main() { cin>>n>>m; for(int i=1;i<=m;i++) { int a,b; cin>>a>>b; add(a,b); in[b]++; eat[a]++; } topo(); for(int i=1;i<=n;i++) { if(eat[i]==0) ans=(ans+d[i])%mod; } cout<<ans; }
-
1
#include <bits/stdc++.h> #define mod 80112002 using namespace std; const int N=5005; vector<int> e[N]; int n,m,k,s,t,rd[N],cd[N],f[N]; void add(int s,int t){ e[s].push_back(t); rd[t]++; cd[s]++; } int main() { cin>>n>>m; for (int i=1;i<=m;++i){ cin>>s>>t; add(s,t); } queue<int> q; //计算拓扑序 for (int i=1;i<=n;++i) if (rd[i]==0){ f[i]=1; q.push(i); } //一边求拓扑序,一遍dp while (!q.empty()){ int x=q.front(); q.pop(); for (int &y:e[x]){ f[y]=(f[y]+f[x])%mod; if (--rd[y]==0) q.push(y); } } int ans=0; //答案累加所有出度为0的点的f值 for (int i=1;i<=n;++i) if (cd[i]==0) ans=(ans+f[i])%mod; cout<<ans<<endl; }
-
0
#include <bits/stdc++.h> using namespace std; int n,m,in[100005],out[100005]; vector<int> e[100005]; queue<int> q; int f[100005]; const int MOD = 80112002; void dfs() { while(!q.empty()) { int u = q.front(); q.pop(); for(int i=0; i < e[u].size() ;i++) { int v = e[u][i]; f[v] = (f[v] + f[u]) % MOD; in[v]--; if(in[v] == 0) { q.push(v); } } } } int main() { cin >> n >> m; for(int i=1; i <= m ;i++) { int v,u; cin >> v >> u; in[v]++; out[u]++; e[u].push_back(v); } for(int i=1; i <= n;i++) { if(in[i] == 0) { q.push(i); f[i] = 1; } } dfs(); int ans = 0; for(int i=1; i <= n;i++) { if(out[i] == 0 && in[i] != 0) ans = (ans + f[i]) % MOD; } cout << ans; }
-
0
核心代码
int n,m,x,y,k,ans=0; cin>>n>>m; for(int i=1; i<=m; i++){ cin>>x>>y; out[x]++;//出度 in[y]++;//入度 a[x][y]=1; } for(int i=1; i<=n; i++){//f[i]表示从食物链的起点到i有几条路 if(in[i]==0){//此时i为食物链起点 f[i]=1;//i到i只有一条路线 q.push(i);//入读为0点入队 } } while(!q.empty()){ x=q.front(); q.pop(); for(int i=1; i<=n; i++){ if(a[x][i]){//找跟i相连结的点 in[i]--;//入度减1 a[x][i]=0;//删掉边 f[i]=(f[x]+f[i])%mod; if(in[i]==0){ q.push(i); } if(in[i]==0&&out[i]==0){//已经到食物链的最高端 ans=(ans+f[i])%mod; } } } } } //拓扑排序
- 1
信息
- ID
- 130
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 4
- 标签
- 递交数
- 115
- 已通过
- 50
- 上传者