洛谷-题解 P1073最优贸易
作者:互联网
https://www.luogu.org/problemnew/show/P1073
2009年提高组t3,用了$spfa$
相对于普通的$spfa$也就更新最优解时有点不一样
注意:对于环没有必要判断,反正环不会让答案不断更新
1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<algorithm> 5 #include<cstring> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define re register int 10 inline int read(){ 11 int x=0,ff=1;char c=getchar(); 12 while(c<'0'||c>'9'){if(c=='-')ff=-1;c=getchar();} 13 while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();} 14 return x*ff; 15 } 16 struct tree{ 17 int to,next; 18 }a[1000005]; 19 int h[100005],tot,f[100005],g[100005],n,m,c[100005]; 20 bool b[100005]; 21 void add(int x,int y){ 22 a[++tot].next=h[x];a[tot].to=y;h[x]=tot; 23 } 24 signed main(){ 25 queue<int>dl; 26 n=read();m=read();int x,y,z; 27 for(int i=1;i<=n;i++){c[i]=read();f[i]=g[i]=c[i];dl.push(i);} 28 while(m--){ 29 x=read();y=read();z=read(); 30 add(x,y);if(z>1)add(y,x); 31 } 32 while(!dl.empty()){ 33 x=dl.front();dl.pop();b[x]=0; 34 for(int i=h[x];i;i=a[i].next){ 35 if(f[x]<f[a[i].to]){//更新卖出价 36 f[x]=f[a[i].to]; 37 if(!b[x]){ 38 b[x]=1;dl.push(x); 39 } 40 } 41 if(b[x])continue; 42 if(g[a[i].to]>g[x]){//更新买入价 43 g[a[i].to]=g[x]; 44 if(!b[a[i].to]){ 45 b[a[i].to]=1;dl.push(a[i].to); 46 } 47 } 48 if(f[x]-g[x]>f[a[i].to]-g[a[i].to]){//到此点是,已经出售 49 f[a[i].to]=f[x];g[a[i].to]=g[x]; 50 if(!b[a[i].to]){ 51 b[a[i].to]=1;dl.push(a[i].to); 52 } 53 } 54 } 55 } 56 printf("%d\n",max(0,f[n]-g[n])); 57 return 0; 58 }
标签:dl,洛谷,int,题解,spfa,read,while,include,P1073 来源: https://www.cnblogs.com/ffrxy01bt/p/11221205.html