1. 程式人生 > >洛谷 P1828 香甜的黃油 Sweet Butter 題解

洛谷 P1828 香甜的黃油 Sweet Butter 題解

分析 org har 16px emp oid head 最優 ems

此文為博主原創題解,轉載時請通知博主,並把原文鏈接放在正文醒目位置。

題目鏈接:https://www.luogu.org/problem/show?pid=1828

題目描述

農夫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),當然,連接是雙向的

輸出格式:

一行 輸出奶牛必須行走的最小的距離和

輸入輸出樣例

輸入樣例#1:
3 4 5
2
3
4
1 2 1
1 3 5
2 3 7
2 4 3
3 4 5
輸出樣例#1:
8

說明

{樣例圖形

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

} {說明:

放在4號牧場最優}

分析:

一開始寫了Floyd,完美TLE,怎麽也調不過來

非常尷尬於是寫了SPFA+暴力枚舉。

AC代碼:

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<queue>
 6 
 7 inline void read(int &x)
 8 {
 9     char ch = getchar(),c = ch;x = 0
; 10 while(ch < 0 || ch > 9) c = ch,ch = getchar(); 11 while(ch <= 9 && ch >= 0) x = (x<<1)+(x<<3)+ch-0,ch = getchar(); 12 if(c == -) x = -x; 13 } 14 15 int n,p,c,f,t,v,tmp,cnt,ans; 16 int cow[1000],dis[1500],head[3000],vis[1500]; 17 18 struct Edge 19 { 20 int f,t,v,nxt; 21 }e[3000]; 22 23 void build(int f,int t,int v) 24 { 25 e[++cnt].f = f,e[cnt].t = t; 26 e[cnt].v = v,e[cnt].nxt = head[f]; 27 head[f] = cnt; 28 } 29 30 std::queue <int> q; 31 32 void spfa(int s) 33 { 34 memset(vis,0,sizeof(vis)); 35 memset(dis,0x3f,sizeof(dis)); 36 while(!q.empty()) 37 q.pop(); 38 vis[s] = 1,dis[s] = 0; 39 q.push(s); 40 while(!q.empty()) 41 { 42 int u = q.front(); 43 q.pop();vis[u] = 0; 44 for(int i = head[u];i;i = e[i].nxt) 45 { 46 int v = e[i].t; 47 if(dis[v] > dis[u]+e[i].v){ 48 dis[v] = dis[u]+e[i].v; 49 if(!vis[v]) 50 { 51 vis[v] = 1; 52 q.push(v); 53 } 54 } 55 } 56 } 57 } 58 59 inline int Min(int a,int b) 60 {return a<b?a:b;} 61 62 int main() 63 { 64 read(n),read(p),read(c); 65 for(int i = 1;i <= n;++ i){ 66 read(tmp); 67 cow[tmp] ++; 68 } 69 for(int i = 1;i <= c;++ i) 70 { 71 read(f),read(t),read(v); 72 build(f,t,v); 73 build(t,f,v); 74 } 75 /*for(int i = 1;i <= p;++ i) 76 { 77 for(int j = 1;j <= p;++ j) 78 printf("%d ",G[i][j]); 79 printf("\n"); 80 }*/ 81 ans = 2147483640; 82 for(register int i = 1;i <= p;++ i) 83 { 84 tmp = 0; 85 spfa(i); 86 for(register int j = 1;j <= p;++ j) 87 tmp += dis[j]*cow[j]; 88 89 ans = Min(ans,tmp); 90 } 91 printf("%d\n",ans); 92 return 0; 93 }

洛谷 P1828 香甜的黃油 Sweet Butter 題解