[bzoj1731] [Usaco2005 dec]Layout 排队布局
2015-12-24 13:49
351 查看
差分约束系统。。。因为题目要求的是1和n的最大距离所以这题就跑最长路。。
对于互相反感的牛(i与j互相反感,彼此距离至少为len,i<j),就有dis[j]-dis[i]>=len。就加一条i->j,长度为len的边。
有好感的牛(i与j有好感,彼此距离至多len,i<j),就有dis[j]-dis[i]<=len;但因为我们跑的是最长路,所以得改成dis[i]-dis[j]>=-len的形式,就加一条j->i,长度-len的边。
又因为牛是按编号站成一列。。所以dis[i+1]-dis[i]>=0。也就是连一条i->i+1,长度为0的边(1<=i<n)。
如果有正权环的话就无解,如果从点n无法走到点1,也就是说n和1之间没有什么约束,那么1和n距离可以无穷大。。。
其实也可以把权值取反然后跑最短路。。虽然都一样= =
View Code
为啥dfs版的spfa会比kpm写的队列版慢20倍。。。。。。。。。。。也许是数据很少有无解情况吧。。
对于互相反感的牛(i与j互相反感,彼此距离至少为len,i<j),就有dis[j]-dis[i]>=len。就加一条i->j,长度为len的边。
有好感的牛(i与j有好感,彼此距离至多len,i<j),就有dis[j]-dis[i]<=len;但因为我们跑的是最长路,所以得改成dis[i]-dis[j]>=-len的形式,就加一条j->i,长度-len的边。
又因为牛是按编号站成一列。。所以dis[i+1]-dis[i]>=0。也就是连一条i->i+1,长度为0的边(1<=i<n)。
如果有正权环的话就无解,如果从点n无法走到点1,也就是说n和1之间没有什么约束,那么1和n距离可以无穷大。。。
其实也可以把权值取反然后跑最短路。。虽然都一样= =
#include<cstdio> #include<iostream> #include<cstring> using namespace std; const int maxn=1023; struct zs{ int too,pre,dis; }e[23333]; int last[maxn],dis[maxn],dl[maxn],tot; int i,n,m1,m2,a,b,c,l,r,now; bool u[maxn],ins[maxn],flag; int ra;char rx; inline int read(){ rx=getchar();ra=0; while(rx<'0'||rx>'9')rx=getchar(); while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra; } inline void insert(int a,int b,int c){ e[++tot].too=b;e[tot].dis=c;e[tot].pre=last[a];last[a]=tot; } void dfs(int x){ ins[x]=1; for(int i=last[x],to=e[i].too;i&&!flag;i=e[i].pre,to=e[i].too)if(dis[to]<dis[x]+e[i].dis){ dis[to]=dis[x]+e[i].dis;if(ins[to]){flag=1;return;} dfs(to); } ins[x]=0; } int main(){ n=read();m1=read();m2=read(); for(i=1;i<n;i++)insert(i,i+1,0); for(i=1;i<=m1;i++){ a=read();b=read();c=read(); if(a>b)swap(a,b); insert(b,a,-c); } for(i=1;i<=m2;i++){ a=read();b=read();c=read();if(a>b)swap(a,b); insert(a,b,c); } l=0;r=1;dl[1]=n;u =1; while(l<r){ now=dl[++l]; for(i=last[now];i;i=e[i].pre)if(!u[e[i].too]) dl[++r]=e[i].too,u[e[i].too]=1; } if(!u[1]){puts("-2");return 0;} memset(dis,188,sizeof(dis));dis =0; dfs(n); if(flag){puts("-1");return 0;} printf("%d\n",-dis[1]); return 0; }
View Code
为啥dfs版的spfa会比kpm写的队列版慢20倍。。。。。。。。。。。也许是数据很少有无解情况吧。。
相关文章推荐
- OC 中 NSString 字符串处理
- 五--python之数据结构(Data Structures)
- 控件的手势事件OnTouchListener()右滑执行,左滑取消
- Git fetch和git pull的区别
- Redisd VS Memcached
- 机器学习的可行性(四)
- Android 利用Gson生成或解析json
- 机器学习算法中文视频教程
- codevs 2943 射箭 1--等比数列求和+高精度模板
- javaEE之------GZIP全站压缩
- 我眼中的Linux设备树(三 属性)
- Android WebView 缓存处理
- Linux下使用system()函数一定要谨慎
- 项目经验分享——完美解决Access denied for user 'root'@'localhost' (using password: YES)
- OpenWeatherMap API Weather Condition Codes
- Android默认加载页设置
- 采用handle 实现下载图片带有进度条
- OC中字符串的方法测试
- 个人常用linux命令总结
- Spring MVC AOP编程