POJ 3013 Big Christmas Tree dijkstra+优先队列
http://poj.org/problem?id=3013
看到这个题还以为很一般的最短路 dijkstra
第一次用矩阵存边 直接不运行 数据太大,换成链表运行了 TLE ...好吧 看别人的解题报告 dijkstra+优先队列 还有用spfa的 spfa比dijkstra快吗 不清楚 明天写个spfa试试
dijkstra代码 顺便学一下大数的定义 输出
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<queue> using namespace std; const __int64 inf = 999999999999; typedef __int64 lint; int w[50002],head[50002],visit[50002]; lint dis[50002]; int n,e,s_edge; struct Node { int p; lint dis; bool operator < (const Node a)const { return a.dis<dis; } }; struct Edge { int to,w,next; }edge[100004]; void addedge(int u,int v,int w) { s_edge++; edge[s_edge].to=v; edge[s_edge].w=w; edge[s_edge].next=head[u]; head[u]=s_edge; s_edge++; edge[s_edge].to=u; edge[s_edge].w=w; edge[s_edge].next=head[v]; head[v]=s_edge; return ; } void dijkstra() { priority_queue<Node>qu; Node st,se; int i; memset(visit,0,sizeof(visit)); for(i=1;i<=n;i++) dis[i]=inf; dis[1]=0; st.p=1, st.dis=0; qu.push(st); while(!qu.empty()) { st=qu.top(); qu.pop(); if(visit[st.p])continue; visit[st.p]=1; int f; for(f=head[st.p];f;f=edge[f].next) { int g=edge[f].to; if(!visit[g]&&dis[g]>dis[st.p]+edge[f].w) { dis[g]=dis[st.p]+edge[f].w; se.p=g; se.dis=dis[g]; qu.push(se); } } } return ; } int main() { int CASE; scanf("%d",&CASE); while(CASE--) { int i,u,v,W; scanf("%d%d",&n,&e); for(i=1;i<=n;i++) scanf("%d",&w[i]); s_edge=0; memset(head,0,sizeof(head)); while(e--) { scanf("%d%d%d",&u,&v,&W); addedge(u,v,W); } dijkstra(); bool flag=true; lint SUM=0; for(i=2;i<=n;i++) { if(dis[i]==inf) { flag=false ; break; } SUM+=dis[i]*w[i]; } if(flag) printf("%I64d\n",SUM); else printf("No Answer\n"); } return 0; }