标签:闭包 int 复杂度 st 343 sizeof 排序 AcWing
考察:Floyd
思路:
传递闭包应用题.也可以用拓扑排序,这里先练下传递闭包.拓扑排序以后补
传递闭包模板:
1 for(int k=1;k<=n;k++) 2 for(int i=1;i<=n;i++) 3 for(int j=1;j<=n;j++) 4 if(g[i][k]&&g[k][j]) g[i][j] = 1;
矛盾:g[i][i] = 1
无法确定: g[i][j] = 0 && g[j][i] = 0 (i!=j)
剩下就是能确定的情况:每次找到<边最多的字母输出即可.标记已经输出的字母.
每次加一条边,就进行一次Floyd 时间复杂度O(mn3)
优化: 加一条边,只需要针对那条边进行扩展,其他的上一层已经扩展.时间复杂度O(m*n2)
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 const int N = 30; 5 bool g[N][N],st[N]; 6 char s[N]; 7 int n,m; 8 int check() 9 { 10 for(int i=1;i<=n;i++) 11 if(g[i][i]) return 1;//1表示矛盾 12 for(int i=1;i<=n;i++) 13 for(int j=i+1;j<=n;j++) 14 if(!g[i][j]&&!g[j][i]) return 0; 15 return 2; 16 } 17 char get() 18 { 19 int maxn = -1; 20 char c; 21 for(int i=1;i<=n;i++) 22 { 23 int cnt = 0; 24 if(st[i]) continue; 25 for(int j=1;j<=n;j++) 26 if(g[i][j]) cnt++; 27 if(cnt>maxn) maxn = cnt,c = i-1+'A'; 28 } 29 st[c-'A'+1] = 1; 30 return c; 31 } 32 int main() 33 { 34 while(scanf("%d%d",&n,&m)!=EOF&&(n+m)) 35 { 36 int k,type = 0;//第几轮,什么类型 37 memset(g,0,sizeof g); 38 memset(st,0,sizeof st); 39 for(int i=1;i<=m;i++) 40 { 41 scanf("%s",s); 42 int a = s[0]-'A'+1,b = s[2]-'A'+1; 43 g[a][b] = 1; 44 if(!type) 45 { 46 for(int i=1;i<=n;i++) 47 { 48 if(g[i][a]) g[i][b] = 1; 49 if(g[b][i]) g[a][i] = 1; 50 for(int j=1;j<=n;j++) 51 if(g[i][a]&&g[b][j]) g[i][j] = 1; 52 } 53 type = check(); 54 if(type) k = i; 55 } 56 } 57 if(!type) puts("Sorted sequence cannot be determined."); 58 else if(type==1) printf("Inconsistency found after %d relations.\n",k); 59 else{ 60 printf("Sorted sequence determined after %d relations: ",k); 61 for(int i=1;i<=n;i++) printf("%c",get()); 62 printf(".\n"); 63 } 64 } 65 return 0; 66 }
标签:闭包,int,复杂度,st,343,sizeof,排序,AcWing 来源: https://www.cnblogs.com/newblg/p/14725460.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。