比赛 NOIP模拟赛by mzx Day1 评测结果 WAAAWWWTTT
题目名称 零食店 最终得分 30
用户昵称 Rapiz 运行时间 3.115 s
代码语言 C++ 内存使用 4.17 MiB
提交时间 2016-10-19 21:50:59
显示代码纯文本
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<queue>
#define file(x) "snackstore."#x
using std::min;
using std::sort;
using std::queue;
const int MAXN=110,MAXQ=1000010;
struct QY{
	int c,d,id;
	QY(int ic,int idis,int iid):c(ic),d(idis),id(iid){}
};
int n,m,q,dis[MAXN][MAXN],v[MAXN],sd[MAXN],ans[MAXQ];
bool inq[MAXN];
std::vector<QY> qu[MAXN];
bool cmp(const QY& a,const QY& b){
	return a.c<b.c;
}
queue<int> que;
void solve(int s){
	memset(sd,0x3f,sizeof(sd));
	sd[s]=0;
	for(int k=0;k<qu[s].size();k++){
		int c=qu[s][k].c,d=qu[s][k].d,id=qu[s][k].id;
		que.push(s);
		while(!que.empty()){
			int u=que.front();que.pop();
			inq[u]=0;
			for(int i=1;i<=n;i++) if(v[i]<=c&&sd[u]+dis[u][i]<sd[i]){
				sd[i]=sd[u]+dis[u][i];
				if(!inq[i]) inq[i]=1,que.push(i);
			}
		}
		for(int i=1;i<=n;i++) if(i!=s) {
			if(sd[i]<=d) ans[id]++;
			else if(dis[s][i]<=d) ans[id]++;
		}
	}
}
int main(){
	freopen(file(in),"r",stdin);
	freopen(file(out),"w",stdout);
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<=n;i++) scanf("%d",&v[i]);
	memset(dis,0x3f,sizeof(dis));
	for(int i=1;i<=m;i++){
		int u,v,t;
		scanf("%d%d%d",&u,&v,&t);
		dis[u][v]=dis[v][u]=min(dis[u][v],t);
	}
	for(int i=1;i<=q;i++){
		int s,c,d;
		scanf("%d%d%d",&s,&c,&d);
		qu[s].push_back(QY(c,d,i));
	}
	for(int i=1;i<=n;i++) {
		sort(qu[i].begin(),qu[i].end(),cmp);
		solve(i);
	}
	for(int i=1;i<=q;i++) printf("%d\n",ans[i]);
}