Warshall算法又叫floyd-Warshall算法,思想为i->j&&j->k,那么i->k
图上点的先后,这道题不能用拓扑排序做,但是拓扑排序只能得到一个整体“不错”的序列,并不能说明任意两点的先后。
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 map <string, int> mp; 6 int a[205][205], num; 7 8 void op() 9 { 10 int i, j, k; 11 num--; 12 for(j=1;j<=num;j++) 13 { 14 for(i=1;i<=num;i++) 15 { 16 for(k=1;k<=num;k++) 17 { 18 a[i][k]|=a[i][j]&a[j][k]; 19 } 20 } 21 } 22 } 23 24 int main() 25 { 26 int n, m, n1, n2; 27 string s1, s2; 28 scanf("%d %d", &n, &m); 29 num = 1; 30 getchar(); 31 while(n--) 32 { 33 cin >> s1; 34 cin >> s2; 35 cin >> s2; 36 cin >> s2; 37 cin >> s2; 38 if(!mp[s1]) mp[s1] = num++; 39 if(!mp[s2]) mp[s2] = num++; 40 a[mp[s1]][mp[s2]] = 1; 41 } 42 op(); 43 while(m--) 44 { 45 cin >> s1; 46 cin >> s2; 47 cin >> s2; 48 cin >> s2; 49 cin >> s2; 50 n1 = mp[s1]; 51 n2 = mp[s2]; 52 if(a[n1][n2]) printf("Fact "); 53 else if(a[n2][n1]) printf("Alternative Fact "); 54 else printf("Pants on Fire "); 55 } 56 return 0; 57 }