比赛 |
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);
}