• codevs 3294 车站分级


    2013NOIP普及组压轴题。

    其实只要想到这个车子没停的站肯定比停的站级别低,拓扑排序,在节点入队时dis[e[i].v]=dis[head]+1维护最长路即可。

    但要注意此题含有大量重边,若不判重可能会tle掉。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<algorithm>
    #define maxv 1005
    #define maxe 500005
    using namespace std;
    int n,m,g[maxv],dis[maxv],num1,num2=0,regis1[maxv],regis2[maxv];
    bool vis[maxv][maxv];
    int nume=0,inq[maxv];
    struct edge
    {
    int v,nxt;
    }e[maxe];
    void addedge(int uu,int vv)
    {
    e[++nume].v=vv;
    e[nume].nxt=g[uu];
    g[uu]=nume;
    }
    void topu()
    {
    queue <int> q;
    for (int i=1;i<=n;i++)
    {
    if (inq[i]==0)
    {
    q.push(i);
    dis[i]=1;
    }
    }
    while (!q.empty())
    {
    int head=q.front();
    q.pop();
    for (int i=g[head];i;i=e[i].nxt)
    {
    inq[e[i].v]--;
    if (inq[e[i].v]==0)
    {
    q.push(e[i].v);
    dis[e[i].v]=dis[head]+1;
    }
    }
    }
    }
    int main()
    {
    memset(vis,false,sizeof(vis));
    memset(inq,0,sizeof(inq));
    scanf("%d%d",&n,&m);
    for (int i=1;i<=m;i++)
    {
    scanf("%d",&num1);
    for (int j=1;j<=num1;j++)
    {
    scanf("%d",&regis1[j]);
    if (j!=1)
    {
    for (int k=regis1[j-1]+1;k<=regis1[j]-1;k++)
    regis2[++num2]=k;
    }
    }
    for (int j=1;j<=num1;j++)
    for (int k=1;k<=num2;k++)
    {
    if (vis[regis1[j]][regis2[k]]==false)
    {
    vis[regis1[j]][regis2[k]]=true;
    addedge(regis1[j],regis2[k]);
    inq[regis2[k]]++;
    }
    }
    num2=0;
    }
    topu();
    sort(dis+1,dis+n+1);
    printf("%d ",dis[n]);
    return 0;
    }

  • 相关阅读:
    MySQL 优化
    Log4j2 中format增加自定义的参数
    MySQL 索引
    Linux中top和free命令详解(转)
    JAVA面试题
    Servlet3.0的可插拔功能
    开放通用Api,总有你喜欢的
    Git常用命令
    支付宝无法回调或者回调后验签失败
    Promise
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/5061612.html
Copyright © 2020-2023  润新知