【USACO题库】3.2.6 Sweet Butter香甜的黄油
来源:互联网 发布:去哪里投诉淘宝网 编辑:程序博客网 时间:2024/05/17 04:40
这一题,我本来是想用spfa算法的,但后来嫌太累了,就打了个习以为常的floyd算法。floyd算法很简单——三重循环。。。
for (k=1;i<=p;i++) for (i=1;j<=p;j++) for (j=i+1;j<=p;j++) { ... }
后来,发现时间有些慢了(虽然也能过),但依旧改回了spfa。先来看一看floyd的:
#include<cstdio>#include<cstring>#define dislike 666666666using namespace std;int b[501],f[801][801];int n,p,c;int dg(int x){ int s=0; for (int i=1;i<=n;i++) if (x!=b[i]) s+=f[b[i]][x]; return s;}int main(){ freopen("butter.in","r",stdin); freopen("butter.out","w",stdout); int i,j,k,x,ans; scanf("%d%d%d",&n,&p,&c); for (i=1;i<=p;i++) for (j=1;j<=p;j++) f[i][j]=dislike; for (i=1;i<=n;i++) { scanf("%d",&b[i]); } for (i=1;i<=c;i++) { scanf("%d%d%d",&j,&k,&x); f[j][k]=x; f[k][j]=x; } for (k=1;k<=p;k++) { for (i=1;i<=p;i++) { for (j=i+1;j<=p;j++) { if (f[i][k]+f[k][j]<f[i][j]) { f[i][j]=f[i][k]+f[k][j]; f[j][i]=f[i][j]; } } } } ans=999999999; for (i=1;i<=p;i++) { x=dg(i); if (x<ans) ans=x; } printf("%d\n",ans); return 0;}
再来看一看spfa的:
#include<cstdio>#include<cstring>using namespace std;int f[510];struct node{ int x,y,c,next;}a[11000];int len,last[810];void ins(int x,int y,int c){ len++; a[len].x=x;a[len].y=y;a[len].c=c; a[len].next=last[x];last[x]=len;}int mymin(int x,int y) {return x<y?x:y;}int n,p,c;int d[810],st,ed;bool v[810];int list[810],head,tail;void spfa(){ for(int i=1;i<=p;i++) { d[i]=999999999; } d[st]=0; memset(v,false,sizeof(v)); v[st]=true; list[1]=st;head=1;tail=2; if(tail==p+1) tail=1; while(head!=tail) { int x=list[head]; for(int k=last[x];k;k=a[k].next) { int y=a[k].y; if(d[y]>d[x]+a[k].c) { d[y]=d[x]+a[k].c; if(v[y]==false) { v[y]=true; list[tail]=y; tail++;if(tail==p+1) tail=1; } } } v[x]=false; head++; if(head==p+1) head=1; }}int main(){ scanf("%d%d%d",&n,&p,&c); len=0;memset(last,0,sizeof(last)); for(int i=1;i<=n;i++) { scanf("%d",&f[i]); } for(int i=1;i<=c;i++) { int x,y,c; scanf("%d%d%d",&x,&y,&c); ins(x,y,c); ins(y,x,c); } int min=999999999; for(int i=1;i<=p;i++) { int ans=0; st=i; spfa(); for(int j=1;j<=n;j++) { if(d[f[j]]==999999999) { ans=999999999; break; } ans+=d[f[j]]; } min=mymin(min,ans); } printf("%d\n",min); return 0;}
让咱们看一看时间变化从floyd:
再到spfa:
虽然在代码长度上有一点差别,但是时间!!!!!782ms——————>74ms,我*!算了,不说了,希望此篇对读者有些帮助!
阅读全文
0 0
- 【USACO题库】3.2.6 Sweet Butter香甜的黄油
- JZOJ1287.【USACO题库】3.2.6 Sweet Butter香甜的黄油
- 【USACO题库】3.2.6 Sweet Butter香甜的黄油
- [Usaco-3.2.6] Sweet Butter香甜的黄油
- USACO 3.2 Sweet Butter 香甜的黄油 (Bellman DIJ SPFA)
- USACO - 3.2.6 Sweet Butter 香甜的黄油 Dijkstra(迪杰斯特拉算法)+枚举
- 香甜的黄油 Sweet Butter
- [USACO3.2]香甜的黄油 Sweet Butter
- Sweet Butter 香甜的黄油(spfa)
- [LUOGU] P1828 香甜的黄油 Sweet Butter
- USACO 3.2.6 香甜的黄油
- USACO 香甜的黄油
- 题解:[USACO 3.2] 香甜的黄油
- USACO 3.2.6 sweet butter
- USACO 3.2 Sweet Butter (butter)
- USACO 3.2 Sweet Butter
- Cpp环境【Usaco 3.2.6】【Vijos1251】Павлов的香甜黄油
- (1070): 【USACO TRAINING】香甜的黄油
- 树莓派-wiringPI-设置引脚编号模式
- 微信小程序—关于支付回调URL(商城出现订单状态付款完成后,不改变的情况)
- AngualrJS ng-model 数据绑定
- box-sizing 布局
- HDOJ Saving HDU JAVA 2111
- 【USACO题库】3.2.6 Sweet Butter香甜的黄油
- 理解HTTP
- 图的深度优先遍历
- Intent的应用(二)——数据传递
- codeforces 877E. Danil and a Part-time Job (DFS序列+线段树)
- Spark SQL运行原理
- AngualrJS 自定义过滤器
- 八皇后
- 购物车(angularjs)