POJ 1125(最短路+Dijkstra)

题意:

众所周知,证券经纪人对于市场传闻十分敏感。现在你被雇佣去开发一种在经纪人之间传播虚假信息的模式,使得你的雇主在市场中获得特殊的战略优势。为了获得最大的效果,你必须在尽可能快的时间内传播谣言。

不幸的是,证券经纪人只信赖来自他们认为是“可靠来源”的消息。这意味着你必须在开始传播流言时考虑他们之间的关系。当流言开始传播时,某个经纪人需要一定的时间将其传递给他的所有同事。

你的任务是编写一个程序,输出需要选择哪个证券经纪人作为流言传播的起点,以及这个流言传播完整个经纪人社群所需的时间。所需的时间指的是最后一个经纪人接受到消息所花费的时间。

Input

你的程序将输入多个不同股票经纪人群体的数据。每一组的第一行是股票经纪人的人数。接下来一行包括每个经纪人可以联系的人的数量,这些人是谁,和他传递信息给每一个人所花的时间。每一行格式如下:最开始是可以联系的人的数目 n,然后是 n对整数,一对整数代表了他与一个联系人的情况。每一对整数列出的第1个数字是联系人编号(例如:"1"是指社群中的1号联系人),第2个数字是指把消息传给那个联系人需要花几分钟。没有其他的标点符号或空格。

每个人的编号为i(1 ≤ i ≤ nn为一个社群中股票经纪人的总数量),传递信息的时间为t分钟(1 ≤ t ≤ 10),可以与之联系的人的数量为x (0 ≤ x ≤ n-1),股票经纪人的数量为n(1 ≤ n ≤ 100) 。输入的终止条件是股票经纪人社群含有0个人。  

Output

对于每一组数据,你的程序必须输出一行整数,包含能使消息传递得最快的那个联系人,以及给定的消息从这个人传递到最后一个人所花费的时间,以整数分钟来度量。

你的程序可能会收到某种排除了一些人在外的联系网络,如有些人可能无法被任何人联系到。如果你的程序检测到这种不连通的网络,只需输出“disjoint”。请注意,如果消息既能从A传递到B,又能从B传递到A,则两个传递消息的时间不一定相同。

Sample Input

3
2 2 4 3 5
2 1 2 3 6
2 1 2 2 2
5
3 4 4 2 8 5 3
1 5 8
4 1 6 4 10 2 7 5 2
0
2 2 5 1 5
0

Sample Output

3 2
3 10

思路:对n个点进行n次Dijkstra。因为起点传到所有点的时间是距离起点最远的点,所以先找出这个距离,然后枚举n个点作为起点时的结果,如果小就更新。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
const int MAXN=105;
const int INF=0x3f3f3f3f;//防止后面溢出,这个不能太大
bool vis[MAXN];
int pre[MAXN];
int Dijkstra(int cost[][MAXN],int lowcost[],int n,int beg)
{
    for(int i=1; i<=n; i++)
    {
        lowcost[i]=INF;
        vis[i]=false;
        pre[i]= - 1;
    }
    lowcost[beg]=0;
    for(int j=1; j<n; j++)
    {
        int k= - 1;
        int Min=INF;
        for(int i=1; i<=n; i++)
            if(!vis[i]&&lowcost[i]<Min)
            {
                Min=lowcost[i];
                k=i;
            }
        if(k== - 1)break;
        vis[k]=true;
        for(int i=1; i<=n; i++)
            if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i])
            {
                lowcost[i]=lowcost[k]+cost[k][i];
                pre[i]=k;
            }
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        ans=max(ans,lowcost[i]);
    }
    return ans;
}
int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);
    int n;
    while(cin>>n&&n)
    {
        int g[MAXN][MAXN];
        memset(g,INF,sizeof(g));
        for(int i=1;i<=n;i++)
        {
            int num;
            cin>>num;
            while(num--)
            {
                int a,b;
                cin>>a>>b;
                g[i][a]=min(g[i][a],b);
            }
        }
        int dis[MAXN],anst=INF,ansi;
        for(int i=1;i<=n;i++)
        {
            int tmp=Dijkstra(g,dis,n,i);
            if(tmp<anst)
            {
                anst=tmp;
                ansi=i;
            }
        }
        if(anst==INF)
        {
            cout<<"disjoint"<<endl;
        }
        else
            cout<<ansi<<" "<<anst<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Dilly__dally/article/details/82356997