zoukankan      html  css  js  c++  java
  • codeforce 460DIV2 D题

    感觉这个题不错,对拓扑排序有了更深的了解,用两种拓扑排序都写了些试试。

    dfs

     1 #include <cstdio>
     2 #include <algorithm>
     3 #include <iostream>
     4 #include <cstring>
     5 #include <vector>
     6 using namespace std;
     7 const int maxn=300000+10;
     8 char s[maxn];
     9 vector<int>G[maxn];
    10 int n,m;
    11 int f[maxn][27];
    12 int vis[maxn];
    13 int in[maxn];
    14 bool dfs(int u){
    15     vis[u]=-1;
    16     for(int i=0;i<G[u].size();i++){
    17         int v=G[u][i];
    18         if(vis[v]==-1)return false;
    19         if(!vis[v]&&!dfs(v))return false;
    20         for(int i=0;i<26;i++){
    21             f[u][i]=max(f[u][i],f[v][i]);
    22         }
    23     }
    24     f[u][s[u]-'a']++;
    25     vis[u]=1;
    26     return true;
    27 }
    28 bool topo(){
    29     memset(vis,0,sizeof(vis));
    30     for(int i=1;i<=n;i++)if(!vis[i]){
    31         if(!dfs(i))return false;
    32     }
    33     return true;
    34 }
    35 int main(){
    36     while(scanf("%d%d",&n,&m)!=EOF){
    37         memset(in,0,sizeof(in));
    38         memset(f,0,sizeof(f));
    39         scanf("%s",s+1);
    40         for(int i=1;i<=n;i++)G[i].clear();
    41         for(int i=1;i<=m;i++){
    42             int a,b;
    43             scanf("%d%d",&a,&b);
    44             G[a].push_back(b);
    45             if(a==b){
    46                 cout<<"-1"<<endl;
    47                 return 0;
    48             }
    49         }
    50         if(!topo()){
    51             cout<<"-1"<<endl;
    52             continue;
    53         }
    54         int ans=0;
    55         for(int i=1;i<=n;i++){
    56             for(int j=0;j<26;j++){
    57                 ans=max(ans,f[i][j]);
    58             }
    59         }
    60         cout<<ans<<endl;
    61     }
    62 return 0;
    63 }
    View Code

    bfs

     1 #include <cstdio>
     2 #include <algorithm>
     3 #include <iostream>
     4 #include <cstring>
     5 #include <vector>
     6 #include <queue>
     7 using namespace std;
     8 const int maxn=300000+100;
     9 vector<int>G[maxn];
    10 queue<int>q;
    11 char s[maxn];
    12 int n,m;
    13 int in[maxn],f[maxn][30];
    14 int main(){
    15     scanf("%d%d",&n,&m);
    16     memset(f,0,sizeof(f));
    17     memset(in,0,sizeof(in));
    18     scanf("%s",s+1);
    19     int a,b;
    20     for(int i=1;i<=m;i++){
    21         scanf("%d%d",&a,&b);
    22         G[a].push_back(b);
    23         in[b]++;
    24     }
    25     for(int i=1;i<=n;i++){
    26             if(!in[i])q.push(i);
    27             f[i][s[i]-'a']=1;
    28     }
    29     while(!q.empty()){
    30         int u=q.front();q.pop();
    31         for(int i=0;i<G[u].size();i++){
    32             int v=G[u][i];
    33             in[v]--;
    34             if(!in[v])q.push(v);
    35             for(int l=0;l<26;l++){
    36                 f[v][l]=max(f[v][l],f[u][l]+(s[v]==l+'a'));
    37             }
    38         }
    39     }
    40     for(int i=1;i<=n;i++)if(in[i]){
    41         cout<<"-1";
    42         return 0;
    43     }
    44     int ans=0;
    45     for(int i=1;i<=n;i++){
    46         for(int j=0;j<26;j++){
    47             ans=max(ans,f[i][j]);
    48         }
    49     }
    50     cout<<ans;
    51 return 0;
    52 }
    View Code
  • 相关阅读:
    百度网盘下载太慢,试试阿里云网盘?
    linux使用过程中遇到的常见问题
    vscode设置护眼色
    为什么程序员互相之间不能透露薪水?
    机器学习:支持向量机(SVM)
    Java多线程总结(三)
    Java多线程总结(二)
    Java多线程总结(一)
    8.多线程--避免活跃性危险
    7.多线程--线程池的使用
  • 原文地址:https://www.cnblogs.com/LQLlulu/p/8825105.html
Copyright © 2011-2022 走看看