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 }
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 }