mysql 最短路经_poj 3613 Cow Relays 经L边的最短路 | 学步园
題意:
求無向圖s,t點間經過L條邊的最短路。
思路:
矩陣連乘求圖中任意兩點間的最短路不經常用,因為復雜度是N^3logN的,但這種
代碼:
//poj 3613
//sepNINE
#include
#include
using namespace std;
const int maxN=512;
int g[maxN][maxN];
int ans[maxN][maxN];
int tmp[maxN][maxN];
map mymap;
int n;
void mul1()
{
int i,j,k;
for(i=1;i<=n;++i)
for(j=1;j<=n;++j){
tmp[i][j]=INT_MAX;
for(k=1;k<=n;++k)
if(ans[i][k]!=-1&&g[k][j]!=-1)
tmp[i][j]=min(tmp[i][j],ans[i][k]+g[k][j]);
}
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
ans[i][j]=tmp[i][j]==INT_MAX?-1:tmp[i][j];
return ;
}
void mul2()
{
int i,j,k;
for(i=1;i<=n;++i)
for(j=1;j<=n;++j){
tmp[i][j]=INT_MAX;
for(k=1;k<=n;++k)
if(g[i][k]!=-1&&g[k][j]!=-1)
tmp[i][j]=min(tmp[i][j],g[i][k]+g[k][j]);
}
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
g[i][j]=tmp[i][j]==INT_MAX?-1:tmp[i][j];
return ;
}
int main()
{
int i,L,m,s,e;
memset(g,-1,sizeof(g));
scanf("%d%d%d%d",&L,&m,&s,&e);
n=0;
while(m--){
int w,a,b;
scanf("%d%d%d",&w,&a,&b);
if(mymap[a]==0)mymap[a]=++n;
if(mymap[b]==0) mymap[b]=++n;
g[mymap[a]][mymap[b]]=g[mymap[b]][mymap[a]]=w;
}
memset(ans,-1,sizeof(ans));
for(i=1;i<=n;++i)
ans[i][i]=0;
while(L){
if(L%2==1)
mul1();//ans=ans*g;
mul2();//g=g*g;
L=L/2;
}
printf("%d",ans[mymap[s]][mymap[e]]);
}
總結
以上是生活随笔為你收集整理的mysql 最短路经_poj 3613 Cow Relays 经L边的最短路 | 学步园的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux ls不显示total,Lin
- 下一篇: centos8.4 nginx 问题