2 条题解
-
0
#include<bits/stdc++.h> using namespace std; const int N=1e4+10; vector<int>e[N];queue<int>q; int rd[N],f[N],cnt; int main() { int n,m;scanf("%d%d",&n,&m); for(int i=1,a,b;i<=m;i++) { scanf("%d%d",&a,&b); e[b].push_back(a);rd[a]++; } for(int i=1;i<=n;i++)if(rd[i]==0) q.push(i),f[i]=100,cnt++; while(!q.empty()) { int x=q.front();q.pop(); for(int y:e[x]) { rd[y]--; if(rd[y]==0) { f[y]=f[x]+1; cnt++;q.push(y); } } } if(cnt==n) { int ans=0; for(int i=1;i<=n;i++)ans+=f[i]; printf("%d\n",ans); } else puts("Poor Xed"); return 0; } -
0

// 拓扑排序 O(n) #include<bits/stdc++.h> using namespace std; const int N=10010; int n,m,cnt; vector<int> e[N]; int rd[N],d[N]; bool topo(){ for(int i=1;i<=n;i++) d[i]=100; //各点初值 queue<int> q; for(int i=1; i<=n; i++) if(!rd[i]) q.push(i); while(!q.empty()){ int u=q.front(); q.pop(); cnt++; //记录点数 for(auto v:e[u]){ d[v]=max(d[v],d[u]+1); //起点到v的最长路 if(--rd[v]==0) q.push(v); //入度为0 则入队 } } return cnt==n; } int main(){ cin>>n>>m; for(int i=1,a,b; i<=m; i++){ cin>>a>>b; e[b].push_back(a); //从b向a连边 rd[a]++; //记录入度 } if(topo()){ //如果拓扑排序成功 int ans=0; for(int i=1; i<=n; i++) ans+=d[i]; cout<<ans; } else puts("Poor Xed"); }
- 1
信息
- ID
- 12487
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- 递交数
- 26
- 已通过
- 8
- 上传者