洛谷图论入门题--基本题必做 图的遍历—1.珍珠

由于图这方面略微难一些,所以我要把每个做过的题都写成博客;来让我们看一下这道题——珍珠

 

这个题用“弗洛伊德”做还是比较好的;

下面说一下适用于“弗洛伊德”的题目特征:Floyd算法适用于APSP(All Pairs Shortest Paths,多源最短路径),是一种动态规划算法,稠密图效果最佳,边权可正可负。此算法简单有效,由于三重循环结构紧凑,对于稠密图,效率要高于执行|V|次Dijkstra算法,也要高于执行V次SPFA算法。

 

那么对于我们这个题我们应当考虑到某珍珠不是中间重量,即

(last > n / 2 || next > n / 2 )

好吧,下面我们来看一下具体代码

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std; 
 4 int n , tot , d[5010][5010] , //d[][]存图(假想图) tot存个数 
 5     last , next , m , x , y; // last 前驱 next后继 
 6 int main(){
 7     cin>>n>>m;
 8     for(int i = 1 ; i <= m ; i ++){
 9         cin >> x >> y;
10         d[x][y] = 1;
11     }
12     //弗洛伊德算法  复杂度O(n3) 
13     for(int k = 1 ; k <= n ; k ++){
14         for(int i = 1 ; i <= n ; i ++){
15              for(int j = 1 ; j <= n ; j ++){
16                 d[i][j] = d[i][j] || (d[i][k] && d[k][j]);
17                 /* 
18                     "||" 这个代表 d[i][j] == 1 或者 
19                      d[i][k] && d[k][j] == 1 时,d[i][j]都为1 
20                 */
21              }
22         }
23     }
24     //计算个数 
25     for(int i = 1 ; i <= n ; i ++){
26         last = 0;
27         next = 0;
28         for(int j = 1 ; j <= n ; j ++){
29             if(d[i][j] == 1)
30             last ++;//前驱 
31             if(d[j][i] == 1)
32             next ++;//后继 
33         }
34         if(last > n / 2 || next > n / 2 )
35         tot ++;
36     }
37     cout<<tot<<endl;
38     return 0;
39     //结束 
40 }
View Code

好吧,这篇博客就先写这么多,毕竟时间有限,同行们看到了这篇随笔的话可以顺便看一个这个友情链接   蒟蒻  http://mrmorning.coding.me/大佬给你们助阵!

posted @ 2017-03-31 21:31  秦时、长浩  阅读(523)  评论(0编辑  收藏  举报