Stockbroker Grapevine

来源:互联网 发布:论文网站知乎 编辑:程序博客网 时间:2024/06/10 01:29

题目链接:http://vjudge.net/contest/view.action?cid=47127#problem/B


题目大意:

输入一个有向带权图,求一个起点,使其能遍历所有顶点并且时间最短。即求出其最小生成图的半径。

 

思路:

先要用floyd算法求出这个有向图的最小生成图。然后算出各个顶点的ecc(eccentricity),即可知图的radius。


算法步骤:

步骤1:floyd算法对图进行整理。

//floydfor(int k = 1; k <= n; k++)    for(int i = 1; i <= n; i++)        for(int j = 1; j <= n; j++)            if(dis[i][j] > dis[i][k] + dis[k][j])                dis[i][j] = dis[i][k] + dis[k][j];
复杂度为O(n^3)

步骤2:计算各点的ecc。

//computing eccfor(int i = 1; i <= n ; i++){for(int j = 1; j <= n; j++){//cout<<dis[i][j]<<" ";if(dis[i][j] > ecc[i])    ecc[i] = dis[i][j];}//cout<<endl;}
复杂度O(n^2)


步骤3,找出中心点,并判断图是否连通,若连通,则输出该点序号及生成图的半径。

int cen = 1;//center point//choose the one with minimum eccfor(int i = 1 ; i <= n ; i ++){//cout<<"ecc["<<i<<"] = "<<ecc[i]<<endl;if(ecc[i] < ecc[cen])        cen = i;}//outputif( ecc[cen] == INF)//disconnected    cout << "disjoint" << endl;else cout << cen << " " << ecc[cen]<<endl;


完整代码如下:

#include <iostream>#include "memory.h"#define INF 0x3f3f3f3fusing namespace std;int dis[105][105];//distance matrixint ecc[105];//max eccentricity for each people int main(){    int n;    while(cin>>n, n != 0)//n people    {memset(dis,0x3f,sizeof(dis));//initializationmemset(ecc,0,sizeof(ecc));int m;//connecting number for each peoplefor(int i = 1; i <= n; i ++)//n people{cin>>m;int k,value;dis[i][i] = 0;if (m != 0)    for (int j = 1; j <= m; j++)    {    cin>>k>>value;    dis[i][k] = value;    }}//floydfor(int k = 1; k <= n; k++)    for(int i = 1; i <= n; i++)        for(int j = 1; j <= n; j++)            if(dis[i][j] > dis[i][k] + dis[k][j])                dis[i][j] = dis[i][k] + dis[k][j];//computing eccfor(int i = 1; i <= n ; i++){for(int j = 1; j <= n; j++){//cout<<dis[i][j]<<" ";if(dis[i][j] > ecc[i])    ecc[i] = dis[i][j];}//cout<<endl;}int cen = 1;//center point//choose the one with minimum eccfor(int i = 1 ; i <= n ; i ++){//cout<<"ecc["<<i<<"] = "<<ecc[i]<<endl;if(ecc[i] < ecc[cen])        cen = i;}//outputif( ecc[cen] == INF)//disconnected    cout << "disjoint" << endl;else cout << cen << " " << ecc[cen]<<endl;}    return 0;}

评测系统上运行结果:Accepted,运行时间0ms,占用内存260KB.



0 0
原创粉丝点击