poj1125 基础最短路

题目:https://vjudge.net/problem/POJ-1125

Stockbrokers are known to overreact to rumours. You have been contracted to develop a method of spreading disinformation amongst the stockbrokers to give your employer the tactical edge in the stock market. For maximum effect, you have to spread the rumours in the fastest possible way.

Unfortunately for you, stockbrokers only trust information coming from their "Trusted sources" This means you have to take into account the structure of their contacts when starting a rumour. It takes a certain amount of time for a specific stockbroker to pass the rumour on to each of his colleagues. Your task will be to write a program that tells you which stockbroker to choose as your starting point for the rumour, as well as the time it will take for the rumour to spread throughout the stockbroker community. This duration is measured as the time needed for the last person to receive the information.Input

Your program will input data for different sets of stockbrokers. Each set starts with a line with the number of stockbrokers. Following this is a line for each stockbroker which contains the number of people who they have contact with, who these people are, and the time taken for them to pass the message to each person. The format of each stockbroker line is as follows: The line starts with the number of contacts (n), followed by n pairs of integers, one pair for each contact. Each pair lists first a number referring to the contact (e.g. a ‘1‘ means person number one in the set), followed by the time in minutes taken to pass a message to that person. There are no special punctuation symbols or spacing rules.

Each person is numbered 1 through to the number of stockbrokers. The time taken to pass the message on will be between 1 and 10 minutes (inclusive), and the number of contacts will range between 0 and one less than the number of stockbrokers. The number of stockbrokers will range from 1 to 100. The input is terminated by a set of stockbrokers containing 0 (zero) people.

Output

For each set of data, your program must output a single line containing the person who results in the fastest message transmission, and how long before the last person will receive any given message after you give it to this person, measured in integer minutes.
It is possible that your program will receive a network of connections that excludes some persons, i.e. some people may be unreachable. If your program detects such a broken network, simply output the message "disjoint". Note that the time taken to pass the message from person A to person B is not necessarily the same as the time taken to pass it from B to A, if such transmission is possible at all.

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

题意:

这题每个人传递消息是同时进行的,求最后一个人知道消息的最短时间。

先枚举每个人为起点的情况,然后这个情况下求每个人知道消息的最短时间,然后遍历一遍找到最大的那个,就是最后一个人收到消息的时间了。然后比较出所以情况中最后一个人知道消息的时间的最小值,即所求答案。

思路:

枚举每个人为起点的最短路,求最小值,迪杰斯特拉算法直接暴力过,,

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#define maxn 10005
#define inf 1e9+7
using namespace std;
int dis[maxn];
int mp[maxn][maxn];
int n,mazz;
void init()
{
    for(int i=1;i<=n;i++)
    {
        dis[i]=inf;
    }
}
void dijkstra(int n,int s)
{
    bool vis[maxn];
   memset(vis,false,sizeof(vis));
   for(int i=1;i<=n;i++)
   {
       dis[i]=mp[s][i];
   }
   dis[s]=0;
   vis[s]=true;
    for(int i=1;i<=n;i++){
    int u=s;
    mazz=inf;
    for(int j=1;j<=n;j++)
    {
        if(!vis[j]&&dis[j]<mazz)
        {
            u=j;
            mazz=dis[j];
        }
    }
        vis[u]=true;
        for(int zz=1;zz<=n;zz++)
        {
            if(dis[zz]>dis[u]+mp[u][zz]&&!vis[zz])
            {
                dis[zz]=dis[u]+mp[u][zz];
            }
        }
    }
}
int main()
{
    while(scanf("%d",&n))
    {
        if(n==0)break;
        int i,j,m;
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
            {
                if(i<=j)
                mp[i][j]=mp[j][i]=inf;
            }
        }
        for(i=1;i<=n;i++)
        {
            scanf("%d",&m);
            for(j=1;j<=m;j++)
            {
                int x,y;
                scanf("%d%d",&x,&y);
                mp[i][x]=y;
            }
        }
        init();
        int mazz=inf,k=0;
        for(i=1;i<=n;i++)
        {
            dijkstra(n,i);
            int ma=0;
            for(j=1;j<=n;j++)
            {
                if(j!=i)
                {
                    if(dis[j]>ma){ma=dis[j];}

                }
            }
            if(ma<mazz){mazz=ma;k=i;}
        }
      if(k!=0)  printf("%d %d\n",k,mazz);
      else printf("disjoint\n");
    }
    return 0;
}

水题一道,,套套板子

原文地址:https://www.cnblogs.com/huangzzz/p/8366482.html

时间: 2024-08-29 20:08:58

poj1125 基础最短路的相关文章

基础最短路2

基础最短路 Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰. 现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离. Input 本题目包含多组数据,请处理到文件结束.  每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目.城镇分别以0

基础最短路

基础最短路 Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路.N=M=0表示输入结束.接下来M行,每行包括3

HDU 1874 畅通工程续 (基础最短路)

题意  中文 最基础的最短路  注意边可能多次给出  取最小的 #include<cstdio> #include<cstring> using namespace std; const int N = 205, M = 1005; int mat[N][N], v[N], d[N], n, m, s, t; void dijkstra() { memset(d, 0x3f, sizeof(d)); memset(v, 0, sizeof(v)); for(int i = d[s]

图论基础——最短路算法集锦

最短路算法有个基础——————松弛操作(在大多数最短路算法都会涉及) if(d[e[i].v]>d[e[i].u]+w[i])//如果这条边的终点到源点的距离大于起点到源点距离,就替换. { d[e[i].v]>d[e[i].u]+w[i]; } 最短路算法一共有多少种方法我不知道,在这里我只想记录4种: •Dijkstra:求单源点最短路(不含负边权) •Bellman-ford:求单源点最短路(可含负边权) •SPFA(使用队列优化后的Bellman-ford) •Floyd:求各点间的最

基础最短路(模板 bellman_ford)

Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商 店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路.N=M=0表示输入结束.接下来M行,每行包括3个整数A,

基础最短路(模板 spfa)

Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去 阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个 假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地

POJ Big Christmas Tree(基础最短路)

Big Christmas Tree 题目分析: 叫你构造一颗圣诞树,使得 (sum of weights of all descendant nodes) × (unit price of the edge)尽量的小.转换后就是求根节点到每个节点的距离最短,也就是最短路.生成树可能会超时,我没试过.然后,求解最短路要用优化的解法不然会超时.最后的答案就是:sum = w[1] * dist[1] + w[2] * dist[2] + ..... w[n] * dist[n].可以自己推推样例就

【LGOJ5651】基础最短路练习题

你以为这是最短路,其实完全不是最短路 这题的难点在于对题面这句话的理解: "保证G中不存在简单环使得边权异或和不为0" 意思是,图里面出现的环,其上的权值异或和一定为0 思考一下这样的环有什么特点呢? 无论在这个环上怎么走,走一边和另一边的答案一定是相同的! 因为两个相同的数异或为0,即这个环的两边的边权是一样的 所以我们只需要在图上随便跑出一棵树,直接输出两个点之间的路径异或值即可 代码: #include<bits/stdc++.h> #define ll long l

hdu2112 HDU Today 基础最短路

这题的关键是把车站的名字转化为点的编号.我用的是map.声明一个map<string,int> st,然后按照字符串出现的次序给st赋值.例如:st[s1]=2;代表这字符串s1出现的次序是2.出现过的已经被标记.不会重复.接下来用模版就好.不过有一点要注意的是当起点和终点一样是,要输出0. #include<iostream> #include<cstdio> #include<cstring> #include<string> #includ