记录编号 56221 评测结果 AAAA
题目名称 服务器储存信息问题 最终得分 100
用户昵称 Gravatarfeng 是否通过 通过
代码语言 C++ 运行时间 0.184 s
提交时间 2013-03-27 17:10:32 内存使用 21.86 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
struct node{
	int nex;
}a[30001];
struct edge{
	int nex,v,y;
}e[400001];
int n,m,ans,p;
bool f[30001];
int vis[30001];
int dis[20][30001];
int queue[3000001];
int r[30001];
void add(int x,int y,int v){
	p++;
	e[p].nex=a[x].nex;
	a[x].nex=p;
	e[p].v=v;
	e[p].y=y;
}
void init(){
	freopen("servers.in","r",stdin);
	freopen("servers.out","w",stdout);
	scanf("%d%d",&n,&m);
	int x,y,v;
	for (int i=1;i<=n;i++)
		scanf("%d",&r[i]);
	for (int i=1;i<=m;i++){
		scanf("%d%d%d",&x,&y,&v);
		add(x,y,v);
		add(y,x,v);
	}
	for (int i=1;i<=n;i++){
		add(r[i]+n,i,0);
		add(i,r[i]+n,0);
	}
}
int i;
void spfa1(){
	memset(f,false,sizeof(f));
	int head=0,tail;
	queue[tail=1]=i+n;
	for (int j=1;j<=n;j++)
		dis[i][j]=1000000000;
	while (head<tail){
		int s=queue[++head];
		f[s]=false;
		int t=a[s].nex;
		while (t){
			if (dis[i][s]+e[t].v<dis[i][e[t].y]){
				dis[i][e[t].y]=dis[i][s]+e[t].v;
				if (!f[e[t].y]){
					queue[++tail]=e[t].y;
					f[e[t].y]=true;
				}
			}
			t=e[t].nex;
		}
	}
}
bool tj[30001];
void spfa2(){
	memset(f,false,sizeof(f));
	memset(vis,-1,sizeof(vis));
	memset(tj,false,sizeof(tj));
	int head=0,tail;
	queue[tail=1]=i;
	vis[i]=0;
	while (head<tail){
		int s=queue[++head];
		int t=a[s].nex;
		f[s]=false;
		if (!tj[s]) ans++;
		tj[s]=true;
		while (t){
			if (e[t].y<=n){
				if (vis[e[t].y]<0 || vis[e[t].y]>e[t].v+vis[s]){
					vis[e[t].y]=e[t].v+vis[s];
					if (!f[e[t].y]){
						int j;
						for (j=r[i]+1;j<=10;j++)
							if (dis[j][e[t].y]<=vis[e[t].y]) break;
						if (j==11){
							queue[++tail]=e[t].y;
							f[e[t].y]=true;
						}
					}
				}
			}
			t=e[t].nex;
		}
	}
}
void work(){
	for (i=1;i<=10;i++)
		spfa1();/*
	for (int i=1;i<=10;i++){
		for (int j=1;j<=n;j++)
			printf("%d ",dis[i][j]);
		printf("\n");
	}*/
	for (i=1;i<=n;i++){
		//printf("%d\n",ans);
		spfa2();
	}
	printf("%d",ans);
}
int main()
{
	init();
	work();
	return 0;
}