poj1426,POJ 3159 Candies 差分約束dij

 2023-11-07 阅读 26 评论 0

摘要:分析:設每個人的糖果數量是a[i] 最終就是求a[n]-a[1]的最大值 然后給出m個關系 u,v,c 表示a[u]+c>=a[v] 就是a[v]-a[u]<=c poj1426、所以對于這種情況,按照u,v,c建單向邊,一條從1到n的路徑就是一個關于1和n的推廣不等式a[n]-a[1]<

分析:設每個人的糖果數量是a[i] 最終就是求a[n]-a[1]的最大值

然后給出m個關系 u,v,c 表示a[u]+c>=a[v] 就是a[v]-a[u]<=c

poj1426、所以對于這種情況,按照u,v,c建單向邊,一條從1到n的路徑就是一個關于1和n的推廣不等式a[n]-a[1]<=k(k為這條路的權)

所以找到所有不等式中最小k,就是求1到n的最短路,這就是差分約束

然后上代碼:

#include<cstdio>
#include<cstring>
#include<queue>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
typedef long long LL;
const int N=3e4+5;
const int INF=0x3f3f3f3f;
struct Edge{int v,w,next;bool operator<(const Edge &e)const{return w>e.w;} 
}edge[N*5];
int head[N],tot,n,m,d[N];
void add(int u,int v,int w){edge[tot].v=v;edge[tot].w=w;edge[tot].next=head[u];head[u]=tot++;
}
priority_queue<Edge>q;
bool vis[N];
int dij(int s,int t){for(int i=1;i<=n;++i)d[i]=INF,vis[i]=0;d[s]=0,q.push(Edge{s,0,0});while(!q.empty()){while(!q.empty()&&vis[q.top().v])q.pop();if(q.empty())break;int u=q.top().v;q.pop();vis[u]=1;for(int i=head[u];~i;i=edge[i].next){int v=edge[i].v;if(!vis[v]&&d[v]>d[u]+edge[i].w){d[v]=d[u]+edge[i].w;q.push(Edge{v,d[v],0});}} }return d[t];
}
int main(){scanf("%d%d",&n,&m);memset(head,-1,sizeof(head)),tot=0;for(int i=1;i<=m;++i){int u,v,w;scanf("%d%d%d",&u,&v,&w);add(u,v,w);}printf("%d\n",dij(1,n));return 0;
}
View Code

poj2106,?

轉載于:https://www.cnblogs.com/shuguangzw/p/5320388.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/167625.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息