首页 > 代码库 > 差分约束入门题ZOJ2770&&AOJ517
差分约束入门题ZOJ2770&&AOJ517
http://icpc.ahu.edu.cn/OJ/Problem.aspx?id=517
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2770
重点是建图,建完图,跑一边最短路,求出最短距离就行了
具体建图见图论算法书P201
ZOJ2770 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #include <list> #include <set> #include <queue> #include <stack> using namespace std; #define INF 0xfffffff const int N=1005,M=25000; struct bian { int u,v,w,next; }edge[M]; bool vis[N]; int dist[N],c[N],head[N],cnt[N]; int n,m,tot; void add(int u,int v,int w) { edge[tot].u=u; edge[tot].v=v; edge[tot].w=w; edge[tot].next=head[u]; head[u]=tot++; } bool spfa(int s) { memset(cnt,0,sizeof(cnt)); memset(vis,false,sizeof(vis)); for(int i=0;i<=n;i++) { dist[i]=INF; } dist[s]=0; queue<int>q; q.push(s); vis[s]=true; cnt[s]++; while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=false; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if(dist[v]>dist[u]+edge[i].w) { dist[v]=dist[u]+edge[i].w; if(!vis[v]) { vis[v]=true; cnt[v]++; if(cnt[v]>n) return false; q.push(v); } } } } return true; } int main() { int l,r,t; while(cin>>n>>m) { memset(head,-1,sizeof(head)); c[0]=0;tot=0; for(int i=1;i<=n;i++) { cin>>t; add(i-1,i,t); add(i,i-1,0); c[i]=c[i-1]+t; } for(int i=1;i<=m;i++) { cin>>l>>r>>t; l--;t=-t; add(r,l,t); add(l,r,c[r]-c[l]); } for(int i=0;i<tot;i++) printf("%d %d %d\n",edge[i].u,edge[i].v,edge[i].w); if(!spfa(n)) printf("Bad Estimations\n"); else printf("%d\n",dist[n]-dist[0]); for(int i=0;i<=n;i++) { printf("dist[%d]=%d\n",i,dist[i]); } } return 0; }
AOJ517 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #include <list> #include <set> #include <queue> #include <stack> using namespace std; #define INF 0xfffffff struct bian { int v,w,next; }edge[5005]; int tot,MAX,MIN; bool vis[1005]; int dist[1005],head[1005]; void add(int u,int v,int w) { edge[tot].v=v; edge[tot].w=w; edge[tot].next=head[u]; head[u]=tot++; } void spfa(int s) { memset(vis,false,sizeof(vis)); for(int i=0;i<=s;i++) { dist[i]=INF; } queue<int>q; dist[s]=0; vis[s]=true; q.push(s); while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=false; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if(dist[v]>dist[u]+edge[i].w) { dist[v]=dist[u]+edge[i].w; if(!vis[v]) { vis[v]=true; q.push(v); } } } } } int main() { int l,r,t,k; MAX=-1,MIN=INF; scanf("%d",&t); tot=0; memset(head,-1,sizeof(head)); for(int i=1;i<=1005;i++) { add(i-1,i,1); add(i,i-1,0); } for(int i=1;i<=t;i++) { scanf("%d%d%d",&l,&r,&k); r++; if(r>MAX) MAX=r; if(l<MIN) MIN=l; add(r,l,-k); add(l,r,r-l); } spfa(MAX); printf("%d\n",dist[MAX]-dist[MIN]); return 0; }
差分约束入门题ZOJ2770&&AOJ517
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。