[bzoj1706] [usaco2007 Nov]relays 奶牛接力跑
2016-07-05 19:50
405 查看
大概是叫倍增Floyd?
显然最多200个点...f[i][j][k]表示从j到k,走2^i步的最小路程。就随便转移了。。
查询的话就是把n二进制位上是1的那些都并起来。
View Code
显然最多200个点...f[i][j][k]表示从j到k,走2^i步的最小路程。就随便转移了。。
查询的话就是把n二进制位上是1的那些都并起来。
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cstdlib> #define ll long long #define ull unsigned long long #define d double using namespace std; const int maxn=1023,inf=1002333333; struct mat{int f[202][202];}f,c; int id[1023]; int i,j,k,n,m,cnt,st,ed; int ra,fh;char rx; inline int read(){ rx=getchar(),ra=0,fh=1; while((rx<'0'||rx>'9')&&rx!='-')rx=getchar(); if(rx=='-')fh=-1,rx=getchar(); while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra*fh; } inline int min(int a,int b){return a<b?a:b;} inline mat run(mat &a,mat &b){ register int i,j,k; for(i=1;i<=cnt;i++)for(j=1;j<=cnt;j++) for(c.f[i][j]=inf,k=1;k<=cnt;k++) c.f[i][j]=min(c.f[i][j],a.f[i][k]+b.f[k][j]); return c; } int main(){ n=read(),m=read(),st=read(),ed=read();int x; memset(f.f,60,sizeof(f.f)); for(i=1;i<=m;i++){ x=read(),j=read(),k=read(); if(!id[j])id[j]=++cnt;if(!id[k])id[k]=++cnt; j=id[j],k=id[k]; f.f[j][k]=min(f.f[j][k],x),f.f[k][j]=min(f.f[k][j],x); } mat g=f;n--; while(n){ if(n&1)g=run(g,f); n>>=1; if(n)f=run(f,f); } printf("%d\n",g.f[id[st]][id[ed]]); }
View Code
相关文章推荐
- UVa11582 巨大的斐波那契数列
- 7月份 北京有关openstack的会议
- Linux网络编程
- 找寻下一波浪潮
- JavaWeb开发入门(一)
- Python 正则表达式练习
- php __set() __get() __isset() __unset()四个方法的应用
- Implement Queue using Stacks
- UML基础知识入门
- 在应用层通过spring特性解决数据库读写分离
- cocos2dx lua class 继承问题
- 【leetcode】125. Valid Palindrome【E】【92】
- Cocoapods降低版本及卸载
- POJ1050 简单的递推~
- Android 4.4 移植到了 PowerPC 架构,支持大端架构
- 读薄经典——《程序员修炼之道》
- MD5,SHA-1,CRC
- Java中的逻辑运算符
- 在ubuntu下安装android studio完整版 吐血整理
- angularjs + jqgrid 实现表格