比赛 NOIP模拟赛by mzx Day1 评测结果 EEEEEEEEEE
题目名称 零食店 最终得分 0
用户昵称 Extreme°/极致 ° 运行时间 1.255 s
代码语言 C++ 内存使用 0.32 MiB
提交时间 2016-10-19 21:52:12
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
using namespace std;
#define N 101
int dis[N],book[N],v[N];
struct node{
        int v;
        int w;
};
vector<node>g[N];
int n,m,q;
void init(int s)
{
        memset(dis,60,sizeof(dis));
        for(int i=0;i<g[s].size();i++)
                dis[g[s][i].v]=g[s][i].w;
        dis[s]=0;book[s]=1;
}
void dijkstra(int c)
{
                for(int t=1;t<=n-1;t++)
                {
                        int minn=0x7fff,u;
                        for(int k=1;k<=n;k++)
                        {
                                if(dis[k]<minn&&book[k]==0)
                                {
                                        u=k;
                                        minn=dis[k];
                                }
                        }
                        book[u]=1;
                        for(int i=0;i<g[u].size();i++)
                        {
                                int j=g[u][i].v;
                                if(dis[j]>dis[u]+g[u][i].w&&v[j]<=c)
                                        dis[j]=dis[u]+g[u][i].w;
                        }
                }
}
int main()
{
        freopen("snackstore.in","r",stdin);
        freopen("snackstore.out","w",stdout);
        scanf("%d %d %d",&n,&m,&q);
        for(int i=1;i<=n;i++)
                scanf("%d",&v[i]);
        int t1,t2,t3;
        node tmp;
        for(int i=1;i<=m;i++)
        {
                scanf("%d %d %d",&t1,&t2,&t3);
                tmp.v=t2;tmp.w=t3;
                g[t1].push_back(tmp);
                tmp.v=t1;
                g[t2].push_back(tmp);
        }
        int s,c,d;
        for(int i=1;i<=q;i++)
        {
                scanf("%d %d %d",&s,&c,&d);
                init(s);
                dijkstra(c);
                int ans=0;
                for(int j=1;j<=n;j++)
                {
                        if(j!=s)
                                if(dis[j]<=d)
                                        ans++;
                }
                printf("%d\n",ans);
        }
        return 0;
}
/*
6 9
1 2 1
1 3 12
2 3 9
2 4 3
3 5 5
4 3 4
4 5 13
4 6 15
5 6 4
*/