比赛 20120710 评测结果 AATTA
题目名称 RCDH外星人 最终得分 60
用户昵称 Citron酱 运行时间 2.001 s
代码语言 C++ 内存使用 6.50 MiB
提交时间 2012-07-10 09:57:56
显示代码纯文本
#include <cstdio>
#include <climits>

#define I_F "et.in"
#define O_F "et.out"

const int MAXn=30000;
const long MAXm=MAXn*5*2;
const long MAXl=MAXm*2;
const short MAXr=10;

struct edge
{
	int x, l;
	edge *next;
};
struct point
{
	int x;
	point *next;
};

edge e_pool[MAXm];
edge *ep=e_pool;
point p_point[MAXn];
point *pp=p_point;
edge *map[MAXn]={NULL};
point *r[MAXr]={NULL};
int n;
long d[MAXn];
int q[MAXl];
bool f[MAXn];
long ans=0;

void Input();
inline long Min(const long&, const long&);
void Spfa(const int&);
void Search();
void Output();

int main()
{
	Input();
	Search();
	Output();
	return 0;
}

void Input()
{
	long m;
	int a, b, c;
	point *temp;
	edge *teme;
	freopen(I_F,"r",stdin);
	scanf("%d%ld",&n,&m);
	for (int i=0; i<n; ++i)
	{
		scanf("%d",&a);
		temp=r[--a];
		r[a]=pp++;
		r[a]->x=i;
		r[a]->next=temp;
	}
	for (long i=0; i<m; ++i)
	{
		scanf("%d%d%d",&a,&b,&c);
		--a, --b;
		teme=map[a];
		map[a]=ep++;
		map[a]->x=b;
		map[a]->l=c;
		map[a]->next=teme;
		teme=map[b];
		map[b]=ep++;
		map[b]->x=a;
		map[b]->l=c;
		map[b]->next=teme;
	}
}

inline long Min(const long &a, const long &b)
{
	return (a<b)?a:b;
}

void Spfa(const int &x)
{
	for (int i=0; i<n; ++i)
		f[i]=false,
		d[i]=LONG_MAX;
	long now=0, tail=1;
	f[x]=true;
	d[x]=0;
	q[0]=x;
	while (now!=tail)
	{
		for (edge *i=map[q[now]]; i!=NULL; i=i->next)
			if (d[q[now]]+i->l<d[i->x])
			{
				d[i->x]=d[q[now]]+i->l;
				if (!f[i->x])
				{
					q[tail]=i->x;
					f[i->x]=true;
					if (++tail==MAXl)
						tail=0;
				}
			}
		f[q[now]]=false;
		if (++now==MAXl)
			now=0;
	}
}

void Search()
{
	long mina, minb;
	for (short i=MAXr-1; i>=0; --i)
		for (point *j=r[i]; j!=NULL; j=j->next)
		{
			Spfa(j->x);
			mina=LONG_MAX;
			for (short k=MAXr-1; k>=i; --k)
			{
				minb=LONG_MAX;
				for (point *l=r[k]; l!=NULL; l=l->next)
				{
					if (d[l->x]<mina)
						++ans;
					minb=Min(d[l->x],minb);
				}
				mina=Min(mina,minb);
			}
		}
}

void Output()
{
	freopen(O_F,"w",stdout);
	printf("%ld\n",ans);
}