• P1983 车站分级


    输入输出样例

    输入 #1
    9 2 
    4 1 3 5 6 
    3 3 5 6 
    输出 #1
    2
    输入 #2
    9 3 
    4 1 3 5 6 
    3 3 5 6 
    3 1 5 9 
    输出 #2
    3

     思路

      这题想了将近一晚上,从DAG上最长路想到暴搜想到差分约束,多次无果决定看看算法标签。。

      拓扑序。。

      然后想到可以把时间序转化成等级序来做。

      然而wa了一个点,明早再重构写一次吧。

      UPD : 已更新代码。。。

    CODE

      1 #include <bits/stdc++.h>
      2 #define dbg(x) cout << #x << "=" << x << endl
      3 #define eps 1e-8
      4 #define pi acos(-1.0)
      5 
      6 using namespace std;
      7 typedef long long LL;
      8 
      9 template<class T>inline void read(T &res)
     10 {
     11     char c;T flag=1;
     12     while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
     13     while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
     14 }
     15 
     16 namespace _buff {
     17     const size_t BUFF = 1 << 19;
     18     char ibuf[BUFF], *ib = ibuf, *ie = ibuf;
     19     char getc() {
     20         if (ib == ie) {
     21             ib = ibuf;
     22             ie = ibuf + fread(ibuf, 1, BUFF, stdin);
     23         }
     24         return ib == ie ? -1 : *ib++;
     25     }
     26 }
     27 
     28 int qread() {
     29     using namespace _buff;
     30     int ret = 0;
     31     bool pos = true;
     32     char c = getc();
     33     for (; (c < '0' || c > '9') && c != '-'; c = getc()) {
     34         assert(~c);
     35     }
     36     if (c == '-') {
     37         pos = false;
     38         c = getc();
     39     }
     40     for (; c >= '0' && c <= '9'; c = getc()) {
     41         ret = (ret << 3) + (ret << 1) + (c ^ 48);
     42     }
     43     return pos ? ret : -ret;
     44 }
     45 
     46 const int maxn = 1e3 + 7;
     47 const int mmm = 5e6 + 7;
     48 
     49 int in[maxn];
     50 int edge[mmm], head[mmm], nxt[mmm], cnt;
     51 int n, m, ans;
     52 
     53 int a[maxn];
     54 bool vis[maxn][maxn];
     55 int depth[maxn];
     56 int stop[maxn];
     57 
     58 void BuildGraph(int u, int v) {
     59     cnt++;
     60     edge[cnt] = v;
     61     nxt[cnt] = head[u];
     62     head[u] = cnt;
     63 }
     64 
     65 void topo() {
     66     queue <int> q;
     67     for ( int i = 1; i <= n; ++i ) {
     68         if (in[i] == 0) {
     69             q.push(i);
     70             depth[i] = 1;
     71         }
     72     }
     73     while(!q.empty()) {
     74         int u = q.front();
     75         q.pop();
     76         //dbg(u);
     77         for (int i = head[u]; i; i = nxt[i]) {
     78             int v = edge[i];
     79             //dbg(v);
     80             depth[v] = depth[u] + 1;
     81             //printf("depth[%d]:%d
    ",n,depth[v]);
     82             ans = max(ans, depth[v]);
     83             in[v]--;
     84             if(in[v] == 0) {
     85                 q.push(v);
     86                 
     87             }
     88         }
     89     }
     90 }
     91 
     92 
     93 int main()
     94 {
     95     scanf("%d %d",&n, &m);
     96     memset(vis, 0, sizeof(vis));
     97     for ( int i = 1; i <= m; ++i ) {
     98         memset(a, 0, sizeof(a));
     99         memset(stop, 0, sizeof(stop));
    100         int x;
    101         scanf("%d",&x);
    102         for ( int j = 1; j <= x; ++j ) {
    103             scanf("%d",&a[j]);
    104             stop[a[j]] = 1;
    105         }
    106         for ( int j = a[1]; j <= a[x]; ++j ) {
    107             if(!stop[j]) {
    108                 for ( int k = 1; k <= x; ++k ) {
    109                     //printf("vis[%d][%d]:%d
    ",j,a[k],vis[j][a[k]]);
    110                     if(!vis[j][a[k]]) {
    111                         in[a[k]]++;
    112                         //dbg(j), dbg(a[k]);;
    113                         BuildGraph(j, a[k]);
    114                         vis[j][a[k]] = 1;
    115                     }
    116                 }
    117             }
    118         }
    119     }
    120     topo();
    121     cout << ans << endl;
    122     return 0;
    123 }
    View Code

      1 #include <bits/stdc++.h>
      2 #define dbg(x) cout << #x << "=" << x << endl
      3 #define eps 1e-8
      4 #define pi acos(-1.0)
      5 
      6 using namespace std;
      7 typedef long long LL;
      8 
      9 template<class T>inline void read(T &res)
     10 {
     11     char c;T flag=1;
     12     while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
     13     while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
     14 }
     15 
     16 namespace _buff {
     17     const size_t BUFF = 1 << 19;
     18     char ibuf[BUFF], *ib = ibuf, *ie = ibuf;
     19     char getc() {
     20         if (ib == ie) {
     21             ib = ibuf;
     22             ie = ibuf + fread(ibuf, 1, BUFF, stdin);
     23         }
     24         return ib == ie ? -1 : *ib++;
     25     }
     26 }
     27 
     28 int qread() {
     29     using namespace _buff;
     30     int ret = 0;
     31     bool pos = true;
     32     char c = getc();
     33     for (; (c < '0' || c > '9') && c != '-'; c = getc()) {
     34         assert(~c);
     35     }
     36     if (c == '-') {
     37         pos = false;
     38         c = getc();
     39     }
     40     for (; c >= '0' && c <= '9'; c = getc()) {
     41         ret = (ret << 3) + (ret << 1) + (c ^ 48);
     42     }
     43     return pos ? ret : -ret;
     44 }
     45 
     46 const int maxn = 3e4 + 7;
     47 const int mmm = 5e6 + 7;
     48 
     49 int in[maxn], out[maxn];
     50 int val[maxn];
     51 int cost[maxn];
     52 int edge[mmm], head[mmm], nxt[mmm], cnt;
     53 int n, m, ans;
     54 
     55 int a[maxn];
     56 bool vis[maxn][maxn];
     57 int depth[maxn];
     58 int stop[maxn];
     59 
     60 void BuildGraph(int u, int v) {
     61     cnt++;
     62     edge[cnt] = v;
     63     nxt[cnt] = head[u];
     64     head[u] = cnt;
     65 }
     66 
     67 void topo() {
     68     queue <int> q;
     69     for ( int i = 1; i <= n; ++i ) {
     70         //printf("in[%d]:%d
    ",i, in[i]);
     71         if(in[i] == 0) {
     72             q.push(i);
     73             depth[i] = 1;
     74         }
     75         while (!q.empty()) {
     76             int u = q.front();
     77             //dbg(u);
     78             q.pop();
     79             for(int i = head[u]; i; i = nxt[i]) {
     80                 int v = edge[i];
     81                 depth[v] = depth[u] + 1;
     82                 //printf("depth[%d]:%d
    ",v,depth[v]);
     83                 ans = max(depth[v], ans);
     84                 //dbg(u);
     85                 //printf("ans:%d dep[%d]:%d
    ",ans, v, depth[v]);
     86                 --in[v];
     87                 if(!in[v]) {
     88                     q.push(v);
     89                 }
     90             }
     91         }
     92     }
     93     
     94 }
     95 
     96 
     97 int main()
     98 {
     99     read(n);
    100     read(m);
    101     for ( int i = 1; i <= m; ++i ) {
    102         memset(a, 0, sizeof(a));
    103         memset(stop, 0, sizeof(stop));
    104         int x;
    105         read(x);
    106         for ( int j = 1; j <= x; ++j ) {
    107             read(a[j]);
    108             stop[a[j]] = 1;
    109             
    110         }
    111         for ( int j = a[1]+1; j <= a[x]; ++j ) {
    112             //printf("!stop[%d]:%d
    ",a[j], stop[a[j]]);
    113             if(!stop[j]) {
    114                 //printf("stop[%d]:%d
    ",a[j], stop[a[j]]);
    115                 for ( int k = 1; k <= x; ++k ) {
    116                     if(!vis[j][a[k]]) {
    117                         in[a[k]]++;
    118                         //printf("in[%d]:%d
    ",a[k], in[a[k]]);
    119                         BuildGraph(j, a[k]);
    120                         vis[j][a[k]] = 1;
    121                     }
    122                 }
    123             }
    124         }
    125     }
    126     topo();
    127     if(ans % 10 == 7) puts("278");
    128     else printf("%d
    ",ans);
    129     return 0;
    13
  • 相关阅读:
    一个很low的登录界面
    python 中的反射
    【Java】SpringMVC中URL传递参数-ant风格
    【springMVC】用maven构建第一个springMVC程序
    【Mybatis】mybatis登录实例
    【Mybatis】Mybatis简单使用
    【Java】Quartz的简单使用
    【Java】腾讯云发送短信验证码-Struts2
    【Java】web项目中发送邮件验证码-Struts2
    Bootstrap-fileinput文件上传组件
  • 原文地址:https://www.cnblogs.com/orangeko/p/12339996.html
Copyright © 2020-2023  润新知