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

 

posted @ 2018-04-14 00:16  蒟蒻LQL  阅读(210)  评论(0编辑  收藏  举报