butter

题目描述

农夫John发现做出全威斯康辛州最甜的黄油的方法:糖。把糖放在一片牧场上,他知道N(1<=N<=500)只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油。当然,他将付出额外的费用在奶牛上。

农夫John很狡猾。像以前的Pavlov,他知道他可以训练这些奶牛,让它们在听到铃声时去一个特定的牧场。他打算将糖放在那里然后下午发出铃声,以至他可以在晚上挤奶。

农夫John知道每只奶牛都在各自喜欢的牧场(一个牧场不一定只有一头牛)。给出各头牛在的牧场和牧场间的路线,找出使所有牛到达的路程和最短的牧场(他将把糖放在那)

输入输出格式

输入格式:

 

第一行: 三个数:奶牛数N,牧场数(2<=P<=800),牧场间道路数C(1<=C<=1450)

第二行到第N+1行: 1到N头奶牛所在的牧场号

第N+2行到第N+C+1行: 每行有三个数:相连的牧场A、B,两牧场间距离D(1<=D<=255),当然,连接是双向的

 

输出格式:

 

一行 输出奶牛必须行走的最小的距离和

 

输入输出样例

输入样例
3 4 5
2
3
4
1 2 1
1 3 5
2 3 7
2 4 3
3 4 5
输出样例
8

说明

{样例图形

          P2  
P1 @--1--@ C1
         |
         | 
       5  7  3
         |   
         |     C3
       C2 @--5--@
          P3    P4

} {说明:

放在4号牧场最优

}

因为数据范围也给的很小,所以我们也是枚举所有的点,然后分别求距离和,最后取min。

关于分别求距离和,我们可以先初始化每一个点到所有点的路径长度,最后加和。

所以若用spfa的话时间复杂度O(nve) 或O(n^2)。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<iostream>
 6 #include<queue>
 7 #include<vector>
 8 using namespace std;
 9 typedef long long ll;
10 const int maxn = 2e3 + 5;
11 const int INF = 0x3f3f3f3f;
12 int n, p, c;
13 int nn[maxn];
14 struct Graph
15 {
16     int id, cost;
17 };
18 vector<Graph> v[maxn];
19 ll ans = 10000000;
20 int dis[maxn][maxn];
21 void init_all()
22 {
23     for(int i = 1; i < maxn - 5; ++i)
24         for(int j = 1; j < maxn - 5; ++j) dis[i][j] = INF;
25 }
26 bool vis[maxn], done[maxn];
27 void spfa(int s)            //dis : every point to each point
28 {
29     memset(vis, 0, sizeof(vis));
30     memset(done, 0, sizeof(done));
31     queue<int> q; q.push(s);
32     dis[s][s] = 0; done[s] = vis[s] = 1;
33     while(!q.empty())
34     {
35         int now = q.front(); q.pop(); done[now] = 0;
36         for(int i = 0; i < (int)v[now].size(); ++i)
37         {
38             if(!vis[v[now][i].id])
39             {
40                 if(dis[s][now] + v[now][i].cost < dis[s][v[now][i].id])
41                 {
42                     dis[s][v[now][i].id] = dis[s][now] + v[now][i].cost;
43                     if(!done[v[now][i].id])
44                     {
45                         q.push(v[now][i].id);
46                         done[v[now][i].id] = 1;
47                     }
48                 }
49             }
50         }
51     }
52 }
53 int main()
54 {
55     freopen("butter.in", "r", stdin);
56     freopen("butter.out", "w", stdout);
57     init_all();
58     scanf("%d%d%d", &n, &p, &c);
59     for(int i = 1; i <= n; ++i) 
60     {
61         int x; scanf("%d", &x);
62         nn[x]++;
63     }
64     for(int i = 1; i <= c; ++i)
65     {
66         int a, b, cost; scanf("%d%d%d", &a, &b, &cost);
67         v[a].push_back((Graph){b, cost});        //无向图 
68         v[b].push_back((Graph){a, cost});
69     }
70     for(int i = 1; i <= p; ++i) spfa(i);        //初始化每一个点到其他点的最短路 
71     for(int i = 1; i <= p; ++i)
72     {
73         ll sum = 0;
74         for(int j = 1; j <= p; ++j) sum += nn[j] * dis[j][i];    //距离和 
75         if(sum < ans) ans = sum;
76     }
77     printf("%lld
", ans);
78     return 0;
79 }
原文地址:https://www.cnblogs.com/mrclr/p/8824921.html