ICPCCamp 2016 Day1 ftiasch's Contest #4(All Pair Shortest Path-位运算)
2016-02-21 23:43
441 查看
题意:给一张2000个点的有向图(边的权制均为1),你需要求∑ni=1∑nj=1dis(i,j)\sum_{i=1}^n \sum_{j=1}^n dis(i,j) dis(i,j)是i到j的最短路距离。
不要被复杂度骗了,
位运算暴力过,
O(n3/64)O(n^3/64)
不要被复杂度骗了,
位运算暴力过,
O(n3/64)O(n^3/64)
#include <iostream> #include <cmath> #include <algorithm> #include <cstdio> #include <cstring> #include <string> #include <vector> #include <map> #include <functional> #include <cstdlib> #include <queue> #include <stack> using namespace std; #define For(i,n) for(int i=1;i<=n;i++) #define Fork(i,k,n) for(int i=k;i<=n;i++) #define Rep(i,n) for(int i=0;i<n;i++) #define ForD(i,n) for(int i=n;i;i--) #define ForkD(i,k,n) for(int i=n;i>=k;i--) #define RepD(i,n) for(int i=n;i>=0;i--) #define Forp(x) for(int p=Pre[x];p;p=Next[p]) #define Forpiter(x) for(int &p=iter[x];p;p=Next[p]) #define Lson (o<<1) #define Rson ((o<<1)+1) #define MEM(a) memset(a,0,sizeof(a)); #define MEMI(a) memset(a,127,sizeof(a)); #define MEMi(a) memset(a,128,sizeof(a)); #define INF (500000000000LL) #define F (100000007) #define pb push_back #define mp make_pair #define fi first #define se second #define vi vector<int> #define pi pair<int,int> #define SI(a) ((a).size()) typedef long long ll; typedef unsigned long long ull; ll mul(ll a,ll b){return (a*b)%F;} ll add(ll a,ll b){return (a+b)%F;} ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;} void upd(ll &a,ll b){a=(a%F+b%F)%F;} int read() { int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();} while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();} return x*f; } #define MAXN (2000+10) int n; ll ans=0; ll e[MAXN][MAXN]; ll cur[MAXN]={0},old[MAXN],old2[MAXN]; int To[MAXN]; void bfs(int x){ int nc=1,deep=0,sum=1; Rep(i,40) cur[i]=old[i]=0; cur[x/60]= old[x/60] = 1LL << (x%60); while (nc) { ++deep; int k=0; Rep(i,40) Rep(j,60) if (cur[i]>>j & 1) { To[k++] = i*60 + j; } Rep(i,40) old2[i] = old[i] ; Rep(i,k) Rep(j,40) { old[j] |= e[To[i]][j]; } nc=0; Rep(i,40) { cur[i]= old[i] ^ old2[i]; nc += __builtin_popcountll((ull)cur[i]); } ans+= 1LL * deep * deep * nc; sum+=nc; // cout<<deep << ' '<< nc<<endl; // Rep(i,40) cout<<cur[i]; } ans +=1LL *n*n*(n - sum) ; } char s[MAXN]; int main() { cin >> n; Rep(i,n) { cin>>s; Rep(j,40) { int t=j*60; for(int k=0;k<60;k++) { if (t+k<n && s[t+k] == '1' ) e[i][j] |= 1LL << k; } } } // cout<<"1"<<endl; Rep(i,n) bfs(i); cout<<ans<<endl; return 0; }
相关文章推荐
- Conversion to Dalvik format failed with error 1
- HDU 1021 Fibonacci Again
- 集训队专题(6)1001 Air Raid
- cvWaitKey
- 严重: ContainerBase.addChild: start:
- 结合使用saiku、mondrian workbentch建立多维查询报表
- 结合使用saiku、mondrian workbentch建立多维查询报表
- Educational Codeforces Round 8 F. Bear and Fair Set 最大流
- TableView 的Plain 状态下小细节
- x264(20090216-2245)main函数级的流程图
- AirBnb 等空闲资源分享模式的兴起
- python网络请求和"HTTP Error 504:Fiddler - Receive Failure"
- Codeforces AIM Tech Round (Div. 2) 题解
- sicily——Up Stairs
- Scala的trait
- B - A + B Again
- lintcode-easy-Climbing Stairs
- 可以填空的TextView
- Comparison of video container formats
- Aizu2130-Billion Million Thousand-dp