Warshall算法(闭包)

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\n");
53         else if(a[n2][n1]) printf("Alternative Fact\n");
54         else printf("Pants on Fire\n");
55     }
56     return 0;
57 }

 

posted @ 2020-05-07 02:19  Xxiaoyu  阅读(588)  评论(0)    收藏  举报