比赛 |
20111110 |
评测结果 |
AAAAAAAWWA |
题目名称 |
城市 |
最终得分 |
80 |
用户昵称 |
Czb。 |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2011-11-10 11:01:21 |
显示代码纯文本
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #define min(a,b) a<b?a:b
-
- int n,m,x,y,s,tmp,ans,flag,l[100001],f[10001],ff[10001],t[10001],u[10001][1200],v[10001][1200];
-
- bool ok,b[10001];
-
- int cmp(const void *a,const void *b)
- {
- return *(int *)a-*(int *)b;
- }
-
- void bfs(int k)
- {
- int i,S,e;
- S=e=1;
- l[1]=k;
- while(S<=e)
- {
- for(i=1;i<=t[l[S]];i++)
- {
- if(u[l[S]][i]==y)
- {
- ok=true;
- return;
- }
- if(v[l[S]][i]+tmp<=s&&!b[u[l[S]][i]]&&ff[u[l[S]][i]]<=flag)
- {
- e++;
- l[e]=u[l[S]][i];
- b[l[e]]=true;
- }
- }
- S++;
- }
- }
-
- void solve(int l,int r)
- {
- if(l>r)
- return;
- int k;
- k=(l+r)>>1;
- flag=f[k];
- ok=false;
- if(ff[x]<=flag&&ff[y]<=flag)
- {
- memset(b,0,sizeof(b));
- bfs(x);
- }
- if(ok)
- {
- ans=min(ans,flag);
- solve(l,k-1);
- }
- else
- {
- solve(k+1,r);
- }
- }
-
- int main()
- {
- freopen("cost.in","r",stdin);
- freopen("cost.out","w",stdout);
- int i,j,a,B,c;
- scanf("%d%d%d%d%d",&n,&m,&x,&y,&s);
- for(i=1;i<=n;i++)
- {
- scanf("%d",&f[i]);
- ff[i]=f[i];
- }
- for(i=1;i<=m;i++)
- {
- scanf("%d%d%d",&a,&B,&c);
- flag=0;
- for(j=1;j<=t[a];j++)
- {
- if(u[a][i]==B)
- {
- flag=i;
- break;
- }
- }
- if(flag)
- {
- v[a][flag]=min(v[a][flag],c);
- for(j=1;j<=t[B];j++)
- {
- if(u[B][i]==a)
- {
- v[B][i]=min(v[B][i],c);
- break;
- }
- }
- }
- else
- {
- t[a]++;
- u[a][t[a]]=B;
- v[a][t[a]]=c;
- t[B]++;
- u[B][t[B]]=a;
- v[B][t[B]]=c;
- }
- }
- qsort(f+1,n,4,cmp);
- b[x]=true;
- ans=2000000000;
- solve(1,n);
- if(ans==2000000000)
- {
- ans=-1;
- }
- printf("%d\n",ans);
- fclose(stdin);
- fclose(stdout);
- return 0;
- }