zoukankan      html  css  js  c++  java
  • Sweet Butter USACO 3.2

    用n次djikstra 求最小和的思路,关键是如何优化,开始直接用数组存,case8 就过不去了,后来把extract-min换成

    priority_queue 到case9还是没过去。

    先贴个我的 ,在贴个大牛的

    /*
    
    ID: hubiao cave
    
    PROG: butter
    
    LANG: C++
    
    */
    
    #include<iostream>
    #include<fstream>
    #include<cstring>
    #include<queue>
    
    
    
    using namespace std;
    #define INFINITE 888888
    
    int N,P,C;
    int djistra(int origial);
    int visit[801];
    int counter[801];
    int pastures[801][801];
    
    
    struct mycom
    {
        bool operator()(pair<int,int>p1,pair<int,int>p2)
        {
        if(p1.first!=p2.first)
            return p1.first>p2.first;
        else
        {
            return p1.second>p2.second;
        }
    
        }
    };
    
    int main()
    
    {
    
        ifstream fin("butter.in");
        ofstream fout("butter.out");
    
        int index;
        int start,end,value;
        fin>>N>>P>>C;
    
        for(int i=0;i<N;i++)
        {
            fin>>index;
            counter[index]++;
        }
    
    
        for(int i=1;i<=P;i++)
            for(int j=1;j<=P;j++)
        {
            if(i==j)
                pastures[i][j]=0;
            else
                pastures[i][j]=INFINITE;
        }
        for(int i=0;i<C;i++)
        {
            fin>>start>>end>>value;
            pastures[start][end]=pastures[end][start]=value;
        }
    
        int minimum=INFINITE;
    
        for(int i=1;i<=P;i++)
        {
            int temp=djistra(i);
            if(minimum>temp)
                minimum=temp;
        }
        fout<<minimum<<endl;
        return 0;
    
    
    }
    int djistra(int original)
    {
        priority_queue<pair<int,int> ,vector<pair<int,int> > ,mycom> myheap;
    
        int sum=0;
        int weight[801];
        for(int i=1;i<=P;i++)
        {
            //weight[i]=pastures[original][i];
            weight[i]=INFINITE;
            //myheap.push(make_pair(pastures[original][i],i));
        }
        weight[original]=0;
        myheap.push(make_pair(pastures[original][original],original));
        memset(visit,0,801*4);
    
        bool flag=true;
        while(!myheap.empty())
        {
        
            int marki=1;
            int value;
            //for(int i=1;i<=P;i++)
            //{
                //if(mini>weight[i]&&!visit[i])
                //{
                    //marki=i;
                //
                pair<int, int> p=myheap.top();
                myheap.pop();
                marki=p.second;
                value=p.first;
    
            if(!visit[marki])
            {
            //}
            visit[marki]=1;
            for(int i=1;i<=P;i++)
            {
                if(value+pastures[marki][i]<weight[i])
                {
                    weight[i]=value+pastures[marki][i];
                    myheap.push(make_pair(weight[i],i));
                }
            }
            
            }
    
        //    flag=0;
            //for(int i=1;i<=P;i++)
            //    if(!visit[i])
                    //flag=1;
        }
    
        for(int i=1;i<=P;i++)
        {
            sum+=counter[i]*weight[i];
        }
        return sum;
    }
    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    #include <queue>
    using namespace std;
     
    struct vertex {
        int dist;
        bool known;
    } v[801];
     
    int nCow, nPastures, nEdge;
    int cow[503];
    const int INF = 0x7FFFF;
    // edge
    vector < int >Map[801];
    vector < int >val[801];
     
    int dijkstra(int start)
    {
        for (int i = 1; i <= nPastures; i++) {
            v[i].dist = INF;
            v[i].known = false;
        }
        priority_queue < pair < int, int > >heap;
        heap.push(make_pair(0, start));
        v[start].dist = 0;
     
        int u, w, cost;
        while (!heap.empty()) {
            u = heap.top().second;
            //cout << u << endl;
            heap.pop();
            if (!v[u].known) {
                v[u].known = true;
                for (unsigned int i = 0; i < Map[u].size(); i++) {
                    w = Map[u][i];
                    if (!v[w].known)
                        cost = val[u][i];
                    if (v[w].dist > v[u].dist + cost) {
                        v[w].dist = v[u].dist + cost;
                        heap.push(make_pair(-v[w].dist, w));
                    }
                }
            }
        }
     
        int totalDist = 0;
        for (int j = 0; j <= nCow; j++)
            totalDist += v[cow[j]].dist;
        //cout << start << ' '  << totalDist << endl;
        return totalDist;
    }
     
    int main()
    {
        ifstream fin("butter.in");
        ofstream fout("butter.out");
     
        fin >> nCow >> nPastures >> nEdge;
        for (int i = 0; i < nCow; i++)
            fin >> cow[i];
        int l, r, d;
        for (int i = 0; i < nEdge; i++) {
            fin >> l >> r >> d;
            Map[l].push_back(r);
            Map[r].push_back(l);
            val[l].push_back(d);
            val[r].push_back(d);
        }
     
        int min = INF, walkDist;
        for (int i = 1; i <= nPastures; i++) {
            walkDist = dijkstra(i);
            if (min > walkDist)
                min = walkDist;
        }
     
        cout << min << endl;
        fout << min << endl;
        fin.close();
        fout.close();
        return 0;
    }

     我改过之后的

    /*
    
    ID: hubiao cave
    
    PROG: butter
    
    LANG: C++
    
    */
    
    #include<iostream>
    #include<fstream>
    #include<cstring>
    #include<queue>
    #include<vector>
    
    
    
    using namespace std;
    #define INFINITE 888888
    
    int N,P,C;
    int djistra(int origial);
    int visit[801];
    int counter[801];
    int pastures[801][801];
    
    
    vector<int> gmaps[801];
    vector<int> gvalues[801];
    struct mycom
    {
        bool operator()(pair<int,int>p1,pair<int,int>p2)
        {
        if(p1.first!=p2.first)
            return p1.first>p2.first;
        else
        {
            return p1.second>p2.second;
        }
    
        }
    };
    
    int main()
    
    {
    
        ifstream fin("butter.in");
        ofstream fout("butter.out");
    
        int index;
        int start,end,value;
        fin>>N>>P>>C;
    
        for(int i=0;i<N;i++)
        {
            fin>>index;
            counter[index]++;
        }
    
    
        for(int i=1;i<=P;i++)
            for(int j=1;j<=P;j++)
        {
            if(i==j)
                pastures[i][j]=0;
            else
                pastures[i][j]=INFINITE;
        }
        for(int i=0;i<C;i++)
        {
            fin>>start>>end>>value;
            //pastures[start][end]=pastures[end][start]=value;
            gmaps[start].push_back(end);
            gmaps[end].push_back(start);
            gvalues[start].push_back(value);
            gvalues[end].push_back(value);
        }
    
        int minimum=INFINITE;
    
        for(int i=1;i<=P;i++)
        {
            int temp=djistra(i);
            if(minimum>temp)
                minimum=temp;
        }
        fout<<minimum<<endl;
        return 0;
    
    
    }
    int djistra(int original)
    {
        priority_queue<pair<int,int> ,vector<pair<int,int> > ,mycom> myheap;
    
        int sum=0;
        int weight[801];
        for(int i=1;i<=P;i++)
        {
            //weight[i]=pastures[original][i];
            weight[i]=INFINITE;
            //myheap.push(make_pair(pastures[original][i],i));
        }
        weight[original]=0;
        myheap.push(make_pair(pastures[original][original],original));
        memset(visit,0,801*4);
    
      //  bool flag=true;
        while(!myheap.empty())
        {
        
            int marki=1;
            int value;
            //for(int i=1;i<=P;i++)
            //{
                //if(mini>weight[i]&&!visit[i])
                //{
                    //marki=i;
                //
            pair<int, int> p=myheap.top();
            myheap.pop();
            marki=p.second;
            value=p.first;
    
            if(!visit[marki])
            {
            //}
            visit[marki]=1;
            //for(int i=1;i<=P;i++)
            for(int i=0;i<gmaps[marki].size();i++)
            {
                int w=gmaps[marki][i];
                //if(value+pastures[marki][i]<weight[i])
                
                if(value+gvalues[marki][i]<weight[w])
                {
                    weight[w]=value+gvalues[marki][i];
                    myheap.push(make_pair(weight[w],w));
                }
            }
            
            }
    
        //    flag=0;
            //for(int i=1;i<=P;i++)
            //    if(!visit[i])
                    //flag=1;
        }
    
        for(int i=1;i<=P;i++)
        {
            sum+=counter[i]*weight[i];
        }
        return sum;
    }
  • 相关阅读:
    python map 详解
    python 中的集合(set) 详解
    python中的列表(list) 切片详解
    django 创建数据库表 命令
    django如何检查创建的模型(model)是否有语法错误或者逻辑错误
    python 列表(list)去除重复的元素总结
    python中的 zip函数详解
    django post和get 比较
    正则表达式的特殊符号和字符详细解析
    .NET/MVC-发布到IIS6.1提示未能加载程序集System.Web.Http.WebHost
  • 原文地址:https://www.cnblogs.com/cavehubiao/p/3360347.html
Copyright © 2011-2022 走看看