这周开始的时候,我们队的队长给我们发了上周末的乌鲁木齐网络赛的题解,终于能看到题解了,那个变态的网站一开始居然连题目都看不了,不过后来可以看了,仔细看了看上周末没做出来的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线段树操作,最后求出线段树中一共有多少种不同的值即可。