ZOJ 3946 Highway Project 今年的省赛

省赛当日和江有在这上面花了1个小时,想到的方法就是最小生成树(其实我说的那个方式就是最小生成树的kruskal算法,当时一脸懵逼叫不出名字),然后肉鸽用迪杰斯特拉和优先队列过了,其实我当时也知道迪杰斯特拉用优先队列优化,但是并不会写(所以以后即使书里简略描述的部分还是要认真的尝试一下),所以一看到10的5次,根本没往哪方面想,而且一直没理解题意(当时认为时间是1*2(走回原点)+2==4),而实际是(1+1+2==4)。

然后找到了网上优化后的迪杰斯特拉模板,看了一番,然后理解了。。
就开始玩了
不过这题坑的是初始化要很大,输入输出要long long,
还有个人最近眼睛不是很好经常输入输出的顺序搞错,这点不能忍,样样例有毒啊,即使输入错误输出凑巧还是一样。。

做出后,小开心。。虽然晚饭没吃。。吾辈要好好努力,争取下次比赛早早做出这种懂了就不算难的题目。。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const int maxn=100010;
const long long inf=1e20;
struct node
{
    int b;
    long long t;
    long long v;
    node(int e,long long c,long long d)
    {
        b=e;
        v=c;
        t=d;
    }
    bool operator<(const node&wakaka)const
    {
        if(wakaka.t==t)
        {
            if(wakaka.v==v)
            {
                return b<wakaka.b;
            }
            return v>wakaka.v;
        }
        return t>wakaka.t;
    }
};
int n,m;
vector<node>bian[maxn];
long long dis[maxn];
long long spend[maxn];
bool la[maxn];
void djstl(int s)
{
    for(int i=0;i<n;i++)
    {
        dis[i]=inf;
        spend[i]=inf;
        la[i]=false;
    }
    dis[s]=0;
    spend[s]=0;
    priority_queue<node>q;
    q.push(node(s,spend[s],dis[s]));
    while(!q.empty())
    {
        node x=q.top();
        q.pop();
        if(la[x.b]==true)
            continue;
        la[x.b]=true;
        for(int i=0;i<bian[x.b].size();i++)
        {
            node y=bian[x.b][i];
            if(dis[y.b]>x.t+y.t)
            {
                dis[y.b]=x.t+y.t;
                spend[y.b]=y.v;
                q.push(node(y.b,spend[y.b],dis[y.b]));
            }
            else if(dis[y.b]==x.t+y.t&&spend[y.b]>y.v)
            {
                spend[y.b]=y.v;
                q.push(node(y.b,spend[y.b],dis[y.b]));
            }
        }
    }
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n>>m;
        for(int i=0;i<n;i++)
        {
            bian[i].clear();
        }
        int s,e;
        long long c,d;
        for(int i=1;i<=m;i++)
        {
            cin>>s>>e>>d>>c;
            bian[s].push_back(node(e,c,d));
            bian[e].push_back(node(s,c,d));
        }
        djstl(0);
        long long ansm=0;
        long long anst=0;
        for(int i=1;i<n;i++)
        {
            anst+=dis[i];
            ansm+=spend[i];
        }
        cout<<anst<<" "<<ansm<<endl;
    }
    return 0;
}

你可能感兴趣的:(ZOJ,迪杰斯特拉,浙江省赛)