http://poj.org/problem?id=3013
求最短路
n<=50000 所以要用边来存储
因为数据比较大要用到 longlong 型的 初始化时 INF要为1<<61
虽然讲 m<50000 但是 edge数组开到50000 会RE 要 开到50000 *2 才行
还有 不连通是要输出 0
要注意的是就这些吧
因为输出时ans 直接用到 %d 搞得wa 的都快抓狂了 我还以为是 别的地方错了 一直在看discuss里的评论 。。。
后来女神把 %D改成 %lld AC了
嗷嗷
#include<iostream> #include<stdio.h> #include<string.h> #include<queue> using namespace std; //#define INF 20000000000 const long long INF=(long long) 1<<61-1; int w[150012],adj[150012],num,vis[150012]; long long d[150012]; struct E{int to;int next;int len;}edge[150012]; queue<int > q; void add(int a,int b,int c) { edge[num].to =b; edge[num].next=adj[a]; edge[num].len =c; adj[a]=num++; } void spfa(int s,int n) { int i,a,b; for(i=1;i<=n;i++) d[i]=INF; memset(vis,0,sizeof(vis)); d[s]=0; q.push (s); vis[s]=1; while(!q.empty ()) { a=q.front ();q.pop (); vis[a]=0; for(i=adj[a];i!=0;i=edge[i].next ) { b=edge[i].to ; if(d[b]>d[a]+edge[i].len ) { d[b]=d[a]+edge[i].len ; if(!vis[b]) { q.push (b); vis[b]=1; } } } } } int main() { int t,n,m,i,j,a,b,c; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) scanf("%d",&w[i]); memset(adj,0,sizeof(adj)); num=1; while(m--) { scanf("%d%d%d",&a,&b,&c); add(a,b,c); add(b,a,c); } spfa(1,n); long long ans=0; for(i=2;i<=n;i++) { if(d[i]==INF) break; ans+=w[i]*d[i]; } if(i<=n) printf("No Answer "); else printf("%lld ",ans); } return 0; }