P1137只有60分
作者:互联网
#include <bits/stdc++.h> #define MAXN 100010 #define MAXM 200010 using namespace std; int rd[MAXN],vis[MAXN],head[MAXN],ans[MAXN],temp[MAXN],cont,n,m; struct node{ int v,next;}edge[MAXM]; struct node2{ int x,rd,ans; bool operator<(const node2 &b) const {if (rd==b.rd) return ans>b.ans; else return rd<b.rd;} }; priority_queue <node2> q; int cnt=0; void build(int u,int v) {cnt++; edge[cnt].v=v; edge[cnt].next=head[u]; head[u]=cnt;} int main() { cin>>n>>m; for (int i=1;i<=m;i++) { int xx,yy; cin>>xx>>yy; build(xx,yy); rd[yy]++; } for (int i=1;i<=n;i++) if (!rd[i]) {node2 tmp; tmp.x=i; tmp.rd=0; tmp.ans=1; q.push(tmp);} while (!q.empty()) { node2 tmp; tmp=q.top(); q.pop(); if (ans[tmp.x]<tmp.ans) {ans[tmp.x]=tmp.ans; vis[tmp.x]=0;} if (vis[tmp.x]==1) continue; vis[tmp.x]=1; for (int i=head[tmp.x];i;i=edge[i].next) { node2 tmp2; tmp2.x=edge[i].v; tmp2.rd=rd[tmp2.x]-1; rd[tmp2.x]--; tmp2.ans=tmp.ans+1; q.push(tmp2); } } for (int i=1;i<=n;i++) cout<<ans[i]<<endl; return 0; } /* 我cyq的算法为什么只值60分? 汗汗汗 whyyy? 利用贪心思想,在按照拓扑排序的顺序,(也不是拓扑排序),直接找入度为0的点。全部压入队伍。<-initialize 对于每个点,如果已经被更新过了,就再找一编判断一下(其实这里可以存一个“被影响的链”然后把那条链上的数值全部加1; 如果没有被更新过,则找一下看看。 如果找过了却没有被更新,那就找啊? 按照入度为第一关键字升序排序,ans(也就是能够找到的点降序排序) */
标签:rd,cnt,int,head,60,MAXN,只有,ans,P1137 来源: https://www.cnblogs.com/asanagiyantia/p/12025417.html