/*
cogs 2507 零食店
跪了这题的数据了....
第一遍Q*m 暴力询问 嗯 以为能的70 但只有40
Q已经到了1e6了
考试的时候 放弃了第三题又打了一遍
这次是Q*(n+logn) 最后发现和暴力分一样....
好吧数据很厉害 吓得我在地上爬23333
好吧 考完了之后 看了正解
我靠这不和我的一个样吗
哎 啊啊啊 二分....
傻傻的我笑了 都想出了方程 没打二分
.....
迅速的改成二分 由迅速的wa了 23333
其实这样过不了了 Dij预处理会超时.
看了正解 直接Floyed 巧妙利用了floyed k层循环的含义
状态差不多 最后终于70了 然后优化常树 然后抄了个inf 1e9
这个inf大一点小一点都不对....
知道最后也是卡过去的
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 110
#define inf 1e9+1
using namespace std;
int n,m,Q,r[maxn],f[maxn][maxn][maxn];
int init(){
int x=,f=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
struct node{
int c,o;
}p[maxn];
int cmp(const node &x,const node &y){
return x.c<y.c;
}
void Floyed(){
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
f[k][i][j]=min(f[k-][i][j],f[k-][i][p[k].o]+f[k-][p[k].o][j]);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
sort(f[i][j]+,f[i][j]++n);
}
int main()
{
freopen("snackstore.in","r",stdin);
freopen("snackstore.out","w",stdout);
scanf("%d%d%d",&n,&m,&Q);
int u,v,pos,t;
for(int i=;i<=n;i++){
p[i].c=init();p[i].o=i;
r[i]=p[i].c;
}
sort(p+,p++n,cmp);sort(r+,r++n);
for(int k=;k<=n+;k++)
for(int i=;i<=n+;i++)
for(int j=;j<=n+;j++)
f[k][i][j]=inf;
for(int i=;i<=m;i++){
u=init();v=init();t=init();
if(t<f[][u][v])
f[][u][v]=f[][v][u]=t;
}
for(int i=;i<=n;i++)f[][i][i]=;
Floyed();
while(Q--){
u=init();v=init();t=init();
v=upper_bound(r+,r++n,v)-r-;
pos=upper_bound(f[v][u]+,f[v][u]++n,t)-f[v][u]-;
printf("%d\n",pos-);
}
return ;
}
/*Dij预处理+二分找*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<vector>
#define pa pair<int,int>
#define mk make_pair
#define maxn 110
#define maxm 10010
#define inf 1e9+1
using namespace std;
int n,m,Q,num,head[maxn],c[maxn],r[maxn],sum;
int dis[maxn],f[maxn][maxn][maxn];
bool vis[maxn];
struct node{
int v,t,pre;
}e[maxm*];
priority_queue<pa,vector<pa>,greater<pa> >q;
int init(){
int x=;char s=getchar();
while(s<''||s>'')s=getchar();
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x;
}
void Add(int from,int to,int dis){
num++;e[num].v=to;
e[num].t=dis;
e[num].pre=head[from];
head[from]=num;
}
void Dij(int s,int mx){
while(!q.empty())q.pop();
for(int i=;i<=n;i++)dis[i]=inf;
memset(vis,,sizeof(vis));
q.push(mk(,s));dis[s]=;
while(!q.empty()){
int k=q.top().second;q.pop();
if(vis[k]||(c[k]>mx&&k!=s))continue;vis[k]=;
for(int i=head[k];i;i=e[i].pre){
int v=e[i].v;
if(dis[v]>dis[k]+e[i].t){
dis[v]=dis[k]+e[i].t;
q.push(mk(dis[v],v));
}
}
}
for(int i=;i<=n;i++)
f[s][mx][i]=dis[i];
sort(f[s][mx]+,f[s][mx]++n);
}
void Solve(){
for(int i=;i<=n;i++)
for(int j=;j<=sum;j++)
Dij(i,j);
}
int main()
{
freopen("snackstore.in","r",stdin);
freopen("snackstore.out","w",stdout);
n=init();m=init();Q=init();
int u,v,t;
for(int i=;i<=n;i++){
c[i]=init();r[++sum]=c[i];
}
sort(r+,r++sum);
sum=unique(r+,r++sum)-r-;
for(int i=;i<=n;i++){
int pos=lower_bound(r+,r++sum,c[i])-r;
c[i]=pos;
}
for(int i=;i<=m;i++){
u=init();v=init();t=init();
Add(u,v,t);Add(v,u,t);
}
for(int k=;k<=n+;k++)
for(int i=;i<=n+;i++)
for(int j=;j<=n+;j++)
f[k][i][j]=inf;
Solve();
while(Q--){
int pos=;
u=init();v=init();t=init();
v=upper_bound(r+,r++sum,v)-r-;
pos=upper_bound(f[u][v]+,f[u][v]++n,t)-f[u][v]-;
printf("%d\n",pos);
}
return ;
}
/*SPFA暴力找*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 110
#define maxm 10010
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
ll n,m,Q,num,hea[maxn],dis[maxn],q[maxm*],head,tail,c[maxn];
bool f[maxn];
struct node{
ll v,t,pre;
}e[maxm*];
ll init(){
ll x=,f=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
void Add(ll from,ll to,ll dis){
num++;e[num].v=to;
e[num].t=dis;
e[num].pre=hea[from];
hea[from]=num;
}
void SPFA(ll s,ll mx,ll mxx){
for(int i=;i<=n;i++)dis[i]=inf;
for(int i=;i<=n;i++)f[i]=;
head=;tail=;dis[s]=;
q[++tail]=s;f[s]=;
while(head<=tail){
ll k=q[head++];f[k]=;
if(c[k]>mx&&k!=s)continue;
for(int i=hea[k];i;i=e[i].pre){
ll v=e[i].v;
if(dis[v]>dis[k]+e[i].t){
dis[v]=dis[k]+e[i].t;
if(f[v]==&&dis[v]<=mxx){
f[v]=;q[++tail]=v;
}
}
}
}
}
int main()
{
freopen("snackstore.in","r",stdin);
//freopen("snackstore.out","w",stdout);
n=init();m=init();Q=init();
ll u,v,t;
for(int i=;i<=n;i++)
c[i]=init();
for(int i=;i<=m;i++){
u=init();v=init();t=init();
Add(u,v,t);Add(v,u,t);
}
while(Q--){
int cnt=;
u=init();v=init();
t=init();SPFA(u,v,t);
for(int i=;i<=n;i++)
if(dis[i]<=t&&i!=u)cnt++;
cout<<Q<<" "<<cnt<<endl;
}
return ;
}

最新文章

  1. 亿级Web系统搭建——单机到分布式集群[转]
  2. EntityFramework5.0CodeFirst全面学习
  3. javascript笔记——jikeytang javascript前端群 389875212 精华总结
  4. iOS 添加阴影后 屏幕卡顿 抖动
  5. Android4.2增加新键值
  6. Android ----------获取各种路径(更新中。。。。。。)
  7. SGU 134.Centroid( 树形dp )
  8. Ajax提交底层原型XMLHttpRequest
  9. 轻型Database- sqlite入门
  10. TP5 生成二维码
  11. Android PowerManager电源管理(Android N )
  12. [svc]tomcat配置文件详解-最简单的基于mvn的war包
  13. [Shapefile C Library]读写shp图形(C++&amp;.net Wapper)
  14. nginx的安装 、Nginx默认虚拟主机、nginx用户认证、nginx 域名重定向
  15. C++17尝鲜:编译期 if 语句
  16. 服务器修改用户密码注意iis部署的网站问题
  17. vue使用百度编辑器ueditor踩坑记录
  18. C#-WebForm-LinQ-条件精确查询、高级查询
  19. 29Mybatis_整合ehcache以及应用场景
  20. Unity与Web结合

热门文章

  1. C++ 利用socket实现TCP,UDP网络通讯
  2. bzoj 1059: [ZJOI2007]矩阵游戏 二分图匹配
  3. python处理csv数据
  4. 关于__irq 的使用
  5. 集成activiti-modeler 到 自己的业务系统
  6. 基于android的Socket通信
  7. 14.7.4 InnoDB File-Per-Table Tablespaces
  8. Java多线程(四)之ConcurrentSkipListMap深入分析
  9. 【CF】509E Pretty Song
  10. 此集合已经采用方案 http 的地址。此集合中每个方案中最多只能包含一个地址。