The meaning of problems: given an undirected connected graph, to find S N E via the shortest sides.
Data range: edge number \ (\ Le 100 \) , apex ID \ (\ le1000 \) , \ (N \ LE1 of \ Times. 6 10 ^ \)
answer:
There are three shortest solution, such data may be used range \ (Floyd \)
Can be \ (f [i] [j ] [k] \) represents the \ (I \) to \ (J \) after \ (K \) shortest edges, apparently TLE
Consider doubled. Pretreatment \ (K = 2 ^ K \) , this time \ (f [i] [j ] [k] = min \ {f [i] [l] [k-1] + f [l] [j] [k-1] \} \ )
The \ (n-\) binary split, apparently the first \ (X \) bit \ (1 \) , direct calling \ (F [] [] [X] \) .
Followed by almost the same method can be determined through \ (K \) shortest of the edges.
Note that, according to the vertex run \ (floyd \) time out, so it should be discrete.
The Code
#include<bits/stdc++.h>
#define s(S) 1-S%2
#define g(S) S%2
using namespace std;
const int oo=1000000000;
int n,t,s,e,u,v,c,maxp;
int f[1010][1010][20],ans[1010][1010][2],num[1010],snum;
int main()
{
cin>>n>>t>>s>>e;
num[s]=1;num[e]=2;snum=2;s=1;e=2;
for (int i=1;i<=t;i++)
{
cin>>c>>u>>v;
if (num[u]) u=num[u];else num[u]=++snum,u=num[u];
if (num[v]) v=num[v];else num[v]=++snum,v=num[v];
f[u][v][0]=f[v][u][0]=c;
maxp=max(maxp,max(u,v));
}
for (int k=0;(1<<k)<=n;k++)
for (int i=1;i<=maxp;i++)
for (int j=1;j<=maxp;j++)
{
if (k!=0||((!f[i][j][k]))) f[i][j][k]=oo;
}
for (int k=1;(1<<k)<=n;k++)
for (int l=1;l<=maxp;l++)
for (int i=1;i<=maxp;i++)
for (int j=1;j<=maxp;j++)
{
f[i][j][k]=min(f[i][j][k],f[i][l][k-1]+f[l][j][k-1]);
}//预处理
int S=0,sum=1,S1=0;
while (n&&!(n&1))
{
n>>=1;S1++;
}
for (int i=1;i<=maxp;i++)
for (int j=1;j<=maxp;j++)
{
ans[i][j][S]=f[i][j][S1];
}
n>>=1;S1++;
while (n&&!(n&1))
{
n>>=1;S1++;
}
for (int i=1;i<=maxp;i++)
for (int j=1;j<=maxp;j++)
{
ans[i][j][1]=oo;
}
while (n)
{
S++;S%=2;
for (int l=1;l<=maxp;l++)
for (int i=1;i<=maxp;i++)
for (int j=1;j<=maxp;j++)
{
ans[i][j][S]=min(ans[i][j][S],ans[i][l][s(S)]+f[l][j][S1]);
}
n>>=1;S1++;
while (n&&!(n&1))
{
n>>=1;S1++;
}
for (int i=1;i<=maxp;i++)
for (int j=1;j<=maxp;j++)
{
ans[i][j][s(S)]=oo;
}
}//求ans,与上面几乎一致
cout<<ans[s][e][S]<<endl;
return 0;
}