洛谷图论入门题--基本题必做 图的遍历—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 }
好吧,这篇博客就先写这么多,毕竟时间有限,同行们看到了这篇随笔的话可以顺便看一个这个友情链接 蒟蒻 http://mrmorning.coding.me/大佬给你们助阵!