ACM-9月14日周四周中训练心得

    这周开始的时候,我们队的队长给我们发了上周末的乌鲁木齐网络赛的题解,终于能看到题解了,那个变态的网站一开始居然连题目都看不了,不过后来可以看了,仔细看了看上周末没做出来的skiing,题目大概的意思是给出好几个点之间的距离,然后找到其中最长的一条连通路,并输出其长度。看到网上的一些题解用的是邻接表,这个知识我还不会,问了一下其他组是怎么做的,发现用了弗洛伊德算法居然没有超时。

 

#include<iostream>
#include<cstring>
#include<iomanip>
#include<algorithm>
#include<stdio.h>
using namespace std;
long long T,m,n;
long long look[10005],f[10005],aa[100005];
struct mou
{
    int x,y,l;
}c[100005];
bool cmp(mou cc,mou v)
{
    //if(cc.x==v.x) return cc.y<v.y;
    return cc.x<v.x;
}
int main()
{
int i,x,y,l;
        long long S;
    scanf("%lld",&T);
    for(long long zz=1;zz<=T;zz++)
    {
        memset(f,0,sizeof(f));
        memset(look,0,sizeof(look));
        S=0;
        scanf("%lld%lld",&m,&n);
        for(i=0;i<n;i++)
        {
            scanf("%d%d%d",&c[i].x,&c[i].y,&c[i].l);
            look[c[i].y]++;
        }
        sort(c,c+n,cmp);
        while(1)
        {
            int z=-1,vv=0;
            for(i=0;i<n;i++)
            {
                //cout<<c[i].x<<" "<<look[c[i].x]<<endl;
            if(look[c[i].x]==0)
                {
                    if(f[c[i].y]<f[c[i].x]+c[i].l)
                    f[c[i].y]=f[c[i].x]+c[i].l;
                    look[c[i].y]--;
                    aa[vv++]=c[i].x;
                    if(S<f[c[i].y]) S=f[c[i].y];
                    z=1;

                }

            }
            if(z==-1) break;
            for(int mm=0;mm<vv;mm++)
                    {look[aa[mm]]--;
                    }
        }
        cout<<S<<endl;
    }
}

    还看了一下线段树里的离散化,就是先读入所有区间,然后把区间端点离散化到map中,然后求出所有新的区间(范围变小了),然后再一次set线段树操作,最后求出线段树中一共有多少种不同的值即可。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值