ZOJ 3946 Highway Project 今年的省赛

来源:互联网 发布:网络运营许可证 编辑:程序博客网 时间:2024/06/05 03:46

省赛当日和江有在这上面花了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;}
0 0
原创粉丝点击