分析:唉、建图坑啊、建的稍微挫点、就会TLE、、、建好图就是一个最短路水题
#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; #define INF 0x7ffffff const int N=100005; int dist[N*2+10]; int vis[N*2+10]; int head[N*2+10]; int flag[N*2]; int lay[N*2]; int k,m,n; struct node { int to,next,val; }edge[N*10]; void add(int x,int y,int val) { edge[k].to=y; edge[k].val=val; edge[k].next=head[x]; head[x]=k++; } void init() { k=0; memset(head,-1,sizeof(head)); } queue<int>q; void spfa() { while(!q.empty())q.pop(); memset(vis,0,sizeof(vis)); for(int i=0;i<=2*n;i++) dist[i]=INF; dist[1]=0; vis[1]=1; q.push(1); while(!q.empty()) { int now=q.front(); q.pop(); vis[now]=0; for(int i=head[now];i!=-1;i=edge[i].next) { int s=edge[i].to; if(dist[s]>dist[now]+edge[i].val) { dist[s]=dist[now]+edge[i].val; if(vis[s]==0) { vis[s]=1; q.push(s); } } } } } int main() { int T; int cas=1; scanf("%d",&T); while(T--) { int c,x; memset(flag,0,sizeof(flag)); memset(lay,0,sizeof(lay)); scanf("%d%d%d",&n,&m,&c); init(); for(int i=1;i<=n;i++) { scanf("%d",&x); lay[i]=x; flag[x+n]=1; } for(int i=n+1;i<n*2;i++) { if(flag[i]==1&&flag[i+1]==1) { add(i,i+1,c); add(i+1,i,c); } } for(int i=1;i<=n;i++) { add(n+lay[i],i,0); if(lay[i]>1)add(i,n+lay[i]-1,c); if(lay[i]<n)add(i,n+lay[i]+1,c); } for(int i=1;i<=m;i++) { int a,b,w; scanf("%d%d%d",&a,&b,&w); add(a,b,w); add(b,a,w); } spfa(); printf("Case #%d: ",cas++); if(dist[n]>=INF)printf("-1\n"); else printf("%d\n",dist[n]); } return 0; }