zoukankan      html  css  js  c++  java
  • Aizu:0189-Convenient Location

    Convenient Location

    Time limit 1000 ms
    Memory limit 131072 kB

    Problem Description

    明年毕业的A为就业而搬家。就职的公司在若干城市都有办公室,不同天出勤的办公室也不同。所以A在考虑住在哪去各个办公室的时长最短。
    这里写图片描述
    你为了帮助A,决定去找最方便的居住城市。

    城市从0号开始编号,城市之间有道路。不同的道路对应着不同的通勤时间。A 从所住的城市到该城市的办公室的通勤时间认为是 0。此时考虑到所有城市的通勤时间。例如,城市和道路的设置如图所示,A 住在城市 1 的情形下,到不同城市的通勤时间是

    到城市 0:80
    到城市 1:0
    到城市 2:20
    到城市 3:70
    到城市 4:90
    
    ,总和为 260。
    

    输入道路的数量和所有道路的信息,求出到所有城市的通勤时间最小值和这个最小值对应的城市编号。若有多个城市的总通勤时间都是最小值,输出这些城市编号中的最小值。城市的总数不超过 10,道路的总数不超过 45,所有道路都是双向的,且两个方向的通勤时间是相等的。每个城市到其他任一城市都存在道路。

    Input

    有多组测试数据,输入由单行 0 终止。每个测试数据格式如下。

    n
    a1 b1 c1
    a2 b2 c2
    :
    an bn cn
    

    第1行给出道路数目 n (1 ≤ n ≤ 45) 。接下来 n 行给出第 i 个道路的信息。 ai, bi (0 ≤ ai, bi ≤ 9) 是第 i 个道路连接的城市的编号,ci (0 ≤ ci ≤ 100) 是这条道路的通勤时间。

    Output

    对每个测试数据,输出总通勤时间的最小值和对应最小的城市编号,由空格分开,结尾是换行符。

    Sample Input

    6     
    0 1 80
    1 2 20
    0 2 60
    2 3 50
    3 4 60
    1 4 90
    2
    0 1 1
    1 2 1
    0
    

    Output for the Sample Input

    2 240
    1 2
    

    解题心得:

    1. 因为数据量很小这就很简单了,用每个点跑SPFA然后算出和,直接打印出最小的那个点就是了。

    #include <stdio.h>
    #include <algorithm>
    #include <queue>
    #include <cstring>
    using namespace std;
    const int maxn = 50;
    int Time[maxn],Min,pos,n;
    bool vis[maxn];
    vector <pair<int,int> > ve[maxn];
    
    void init() {
        pos = -1;
        Min = 0x7f7f7f7f;
        for(int i=0;i<=n;i++)
            ve[i].clear();
        int N = 0;
        for(int i=1;i<=n;i++) {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            ve[a].push_back(make_pair(b,c));
            ve[b].push_back(make_pair(a,c));
            N = max(N,a);
            N = max(N,b);
        }
        n = N;
    }
    
    void spfa(int s) {
        queue <int> qu;
        memset(vis,0,sizeof(vis));
        memset(Time,0x7f,sizeof(Time));
        qu.push(s);
        Time[s] = 0;
        while(!qu.empty()) {
            int now = qu.front(); qu.pop();
            vis[now] = false;
            for(int i=0;i<ve[now].size();i++) {
                int v = ve[now][i].first;
                int d = ve[now][i].second;
                if(d+Time[now] < Time[v]) {
                    Time[v] = Time[now] + d;
                    if(!vis[v]) {
                        qu.push(v);
                        vis[v] = true;
                    }
                }
            }
        }
    }
    
    bool updata_Min() {
        int sum = 0;
        for(int i=0;i<=n;i++)
            sum += Time[i];
        if(sum < Min) {
            Min = sum;
            return true;
        }
        return false;
    }
    
    int main() {
        while(scanf("%d",&n) && n) {
            init();
            for(int i=0;i<=n;i++) {
                spfa(i);
                if(updata_Min()) {
                    pos = i;
                }
            }
            printf("%d %d
    ",pos,Min);
        }
        return 0;
    }
  • 相关阅读:
    P2149 [SDOI2009]Elaxia的路线
    P1346 电车
    P3174 [HAOI2009]毛毛虫
    P3047 [USACO12FEB]附近的牛Nearby Cows
    P4053 [JSOI2007]建筑抢修
    P2607 [ZJOI2008]骑士
    [HNOI2006]马步距离
    [POI2014]Hotel
    [BZOJ3856]Monster
    [BZOJ2819]Nim
  • 原文地址:https://www.cnblogs.com/GoldenFingers/p/9107151.html
Copyright © 2011-2022 走看看