比赛 |
防止浮躁的小练习v0.7 |
评测结果 |
AAAAAAATTT |
题目名称 |
零食店 |
最终得分 |
70 |
用户昵称 |
Lethur |
运行时间 |
3.506 s |
代码语言 |
C++ |
内存使用 |
0.55 MiB |
提交时间 |
2016-10-27 21:58:38 |
显示代码纯文本
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cctype>
#include<vector>
#include<queue>
#define MAXN 101
#define INF 0x3f3f3f3f
using namespace std;
int n,m,q;
int v[MAXN]={0};
int f[MAXN*MAXN*2]={0};
int t[MAXN*MAXN*2]={0};
int w[MAXN*MAXN*2]={0};
int cnt=0;
vector<int>edge[MAXN];
template<typename T>inline T read(T &x)
{
int f=1;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
f=-1;
for(x=0;isdigit(ch);ch=getchar())
x=10*x+ch-'0';
return x*=f;
}
template<typename T>inline void write(T x)
{
if(x==0)
{
putchar('0');
return ;
}
if(x<0)
{
putchar('-');
x=-x;
}
int top=0;
static char s[20];
for(;x;x/=10)
{
s[++top]=x%10+'0';
}
while(top)
{
putchar(s[--top]);
}
return ;
}
inline int spfa(int s,int c,int d)
{
queue<int>Q;
int dis[MAXN]={0};
for(int i=1;i<=n;i++)
{
dis[i]=INF;
}
dis[s]=0;
Q.push(s);
while(!Q.empty())
{
int u=Q.front();
Q.pop();
if(v[u]>c&&u!=s)
continue;
for(int i=0;i<edge[u].size();i++)
{
int& e=edge[u][i];
if(dis[t[e]]>dis[u]+w[e])
{
dis[t[e]]=dis[u]+w[e];
Q.push(t[e]);
}
}
}
int ans=0;
/*for(int i=1;i<=n;i++)
{
if(i!=s)
cout<<s<<"到"<<i<<"的距离为 "<<dis[i]<<endl;
}*/
for(int i=1;i<=n;i++)
{
if(dis[i]<=d&&i!=s)
{
ans++;
//cout<<"可到达的零食店: "<<i<<endl;
}
}
return ans;
}
inline void Add(int u,int v,int w1)
{
edge[u].push_back(cnt);
f[cnt]=u;
t[cnt]=v;
w[cnt]=w1;
cnt++;
return ;
}
int main()
{
ios::sync_with_stdio(false);
freopen("snackstore.in","r",stdin);
freopen("snackstore.out","w",stdout);
read(n);
read(m);
read(q);
for(int i=1;i<=n;i++)
{
read(v[i]);
}
for(int i=1;i<=m;i++)
{
int u,v,l;
read(u);
read(v);
read(l);
Add(u,v,l);
Add(v,u,l);
}
for(int i=1;i<=q;i++)
{
int s,c,d;
read(s);
read(c);
read(d);
int ans=spfa(s,c,d);
cout<<ans<<endl;
}
return 0;
}