USACO Section 3.2 香甜的黄油 Sweet Butter

时间:2023-03-08 22:04:32
USACO Section 3.2 香甜的黄油 Sweet Butter

本题是多源最短路问题 但使用弗洛伊德算法会超时 而因为边数目比较少 所以用队列优化后的迪杰斯特拉算法可以通过

 #include<iostream>
 #include<cstring>
 #include<queue>
 #include<vector>
 using namespace std;
 <<;
 struct Edge{
     int from,to,dist;
 };
 struct Node{
     int u,d;
     bool operator<(const Node& n)const{
         return d>n.d;
     }
 };
 vector<Edge> edges;
 +],cnt[+],v[+];
 int N,M,C;
 vector<+];
 void DJSTL(int s){
     ;i<=N;i++) d[i]=inf,v[i]=;
     d[s]=;
     priority_queue<Node> Q;
     Q.push((Node){s,});
     while(!Q.empty()){
         Node x=Q.top();Q.pop();
         int u=x.u;
         v[u]=;
         ;i<G[u].size();i++){
             Edge& e=edges[G[u][i]];
             if(v[e.to]) continue;
             if(d[u]+e.dist<d[e.to]){
                 d[e.to]=d[u]+e.dist;
                 Q.push((Node){e.to,d[e.to]});
             }
         }
     }

 }
 int main()
 {
     memset(cnt,,sizeof(cnt));
     int cow,from,to,dist;
     cin>>C>>N>>M;
     while(C--){
         cin>>cow;
         cnt[cow]++;
     }
     while(M--){
         cin>>from>>to>>dist;
         edges.push_back((Edge){from,to,dist});
         edges.push_back((Edge){to,from,dist});
         int m=edges.size();
         G[);
         G[to].push_back(m-);
     }
     int ans=inf;
     ;i<=N;i++){
         ;
         DJSTL(i);
         ;i<=N;i++) tans+=d[i]*cnt[i];
         ans=min(ans,tans);
     }
     cout<<ans;
     ;
 }