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(也就是能够找到的点降序排序)
*/

  

上一篇:Mac Pro 资源管理器 Double Commander“个性化设置” 备份


下一篇:Kruskal重构树+LCA || BZOJ 3732: Network