Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
开到200000也re,真不知道哪里越界了#include <stdio.h> #include <cstring> #include <iostream> #include <algorithm> #include <queue> using namespace std; const int maxn=200000; const __int64 inf =9999999999LL; struct edge { int from,to,w,next; }e[200000]; int head[maxn]; int vis[maxn]; __int64 dist[maxn]; int point[maxn]; int n,m,t; void add(int i,int j,int w) { e[t].from=i; e[t].to=j; e[t].w=w; e[t].next=head[i]; head[i]=t++; } void spfa(int s) { queue <int> q; for(int i=1;i<=n;i++) dist[i]=inf; memset(vis,false,sizeof(vis)); q.push(s); dist[s]=0; while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=false; for(int i=head[u];i!=-1;i=e[i].next) { int v=e[i].to; if(dist[v]>dist[u]+e[i].w) { dist[v]=dist[u]+e[i].w; if(!vis[v]) { vis[v]=true; q.push(v); } } } } } int main() { int a,b,c,T; while(scanf("%d",&T)) { while(T--) { scanf("%d%d",&n,&m); t=0; memset(head,-1,sizeof(head)); memset(point,0,sizeof(point)); memset(e,0,sizeof(e)); for(int i=1;i<=n;i++) scanf("%d",&point[i]); while(m--) { scanf("%d%d%d",&a,&b,&c); add(a,b,c); add(b,a,c); } spfa(1); int flag=1; __int64 sum=0; for(int i=2;i<=n;i++) { if(dist[i]==inf) flag=0; else sum+=dist[i]*point[i]; } if(flag==0) printf("No Answer\n"); else printf("%I64d\n",sum); } } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator