首页 > 代码库 > UESTC 835
UESTC 835
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; }
UESTC 835
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。