SPFA sll优化
个人感觉这个题的建图有问题
我建对了他说我错 还可能超时
#include<stdio.h> #include<algorithm> #include<string.h> #include<string> #include<vector> #include<queue> #include<iostream> #include<deque> using namespace std; #define inf 1000000000 #define MAXN 4000050 int cnt; struct node { int to,w,next; }edge[MAXN]; int head[200010]; void add(int u,int v,int w) { edge[cnt].to=v; edge[cnt].w=w; edge[cnt].next=head[u]; head[u]=cnt++; } deque<int>q1; bool vis[200010]; int dis[200010]; void spfa(int fr,int to,int n) { memset(vis,0,sizeof(vis)); vis[1]=1; q1.push_back(1); for(int i=0;i<=to;i++) dis[i]=inf; dis[1]=0; while(!q1.empty()) { int now=q1.front(); q1.pop_front(); vis[now]=0; for(int i=head[now];i!=-1;i=edge[i].next) { int v=edge[i].to; if(dis[v]>dis[now]+edge[i].w) { dis[v]=dis[now]+edge[i].w; // printf("%d %d\n",v,dis[v]); if(vis[v]==0) { vis[v]=1; if(!q1.empty()&&dis[v]<dis[q1.front()]) q1.push_front(v); else q1.push_back(v); } } } } if(dis[n]==inf) printf("-1\n"); else printf("%d\n",dis[n]); } int en[100010]; int main() { int t ,ca; scanf("%d",&t); ca=1; while(t--) { int n,m,c; scanf("%d%d%d",&n,&m,&c); cnt=0; memset(head,-1,sizeof(head)); memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) { scanf("%d",&en[i]); vis[en[i]]=1; // add(i,en[i]+n,0); // add(en[i]+n,i,0); } for(int i=1;i<n;i++) { if(vis[i]&&vis[i+1]) { add(n+i,n+i+1,c); add(n+i+1,n+i,c); } } for(int i=1;i<=n;i++) { add(n+en[i],i,0); if(en[i]>1) add(i,n+en[i]-1,c); if(en[i]<n) add(i,n+en[i]+1,c); } for(int i=1;i<=m;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); add(u,v,w); add(v,u,w); } printf("Case #%d: ",ca++); spfa(1,2*n,n); } return 0; }
时间: 2024-11-03 22:18:46