差分约束系统:排队布局
题目https://loj.ac/problem/10090
#include<bits/stdc++.h> #define inf 0x3f3f3f3f using namespace std; long long n,l,d,k,x,a,b; struct node{ long long to,next,w; }e[1000000]; long long head[1000000],num=0; void add(long long x,long long y,long long c) { e[++num].next=head[x],e[num].to=y,e[num].w=c,head[x]=num; } long long tim[1000000],dis[1000000]; bool vis[1000000]; queue<long long>q; void spfa() { memset(dis,inf,sizeof dis); memset(vis,0,sizeof vis); long long ll=dis[n]; vis[1]=1,dis[1]=0,tim[1]=1;//从1开始搜索 q.push(1); while(!q.empty())//bfs { long long u=q.front(); vis[u]=0; q.pop(); for(long long i=head[u];i!=-1;i=e[i].next) { long long v=e[i].to; if(dis[v]>dis[u]+e[i].w) { dis[v]=dis[u]+e[i].w; if(!vis[v]) { if(++tim[v]>n){ cout<<-1;exit(0);//不存在解(即存在环) } q.push(v); vis[v]=1; } } } } if(dis[n]==ll){//判断1到n可以任意距离时 cout<<-2; } else cout<<dis[n]; } int main() { cin>>n>>l>>d; long long a,b,c; memset(head,-1,sizeof head); for(long long i=1;i<=l;i++) { cin>>a>>b>>c; a<b?add(a,b,c):add(b,a,c);//判断一下大小,严谨一些 } for(long long i=1;i<=d;i++) { cin>>a>>b>>c; a<b?add(b,a,-c):add(a,b,-c); } spfa(); }
我也不知道为什么我写的和他们差不多,但比他们慢了一百多毫秒......
得到原因:数组开大了.......