标签:har size sizeof 针对 check namespace rgb term ted
考察: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 }
标签:har size sizeof 针对 check namespace rgb term ted
原文地址:https://www.cnblogs.com/newblg/p/14725460.html