大概是叫倍增Floyd?
显然最多200个点...f[i][j][k]表示从j到k,走2^i步的最小路程。就随便转移了。。
查询的话就是把n二进制位上是1的那些都并起来。
1 #include2 #include 3 #include 4 #include 5 #include 6 #define ll long long 7 #define ull unsigned long long 8 #define d double 9 using namespace std;10 const int maxn=1023,inf=1002333333;11 struct mat{ int f[202][202];}f,c;12 int id[1023];13 int i,j,k,n,m,cnt,st,ed;14 15 int ra,fh;char rx;16 inline int read(){17 rx=getchar(),ra=0,fh=1;18 while((rx<'0'||rx>'9')&&rx!='-')rx=getchar();19 if(rx=='-')fh=-1,rx=getchar();20 while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra*fh;21 }22 inline int min(int a,int b){ return a >=1;43 if(n)f=run(f,f);44 }45 printf("%d\n",g.f[id[st]][id[ed]]);46 }