题解:根据题意创建了有m条路径的一张图,每条路径带权Li,从Si到Ei,求从S出发到E的一条有n长度的最小带权路径和。
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int a[1000][1000],t,n,m,s,e,num,min1=65535,sum,visted[1000][1000],x,a1,b,c;
void bl(int k,int num)
{
if(num>n) return;
if(num==n&&k==e)
{
if(sum<min1) min1=sum;
return;
}
for(int j=1;j<=x;j++)
{
if(a[k][j]&&!visted[k][j])
{
visted[k][j]=1;
visted[j][k]=1;
sum+=a[k][j];
num++;
bl(j,num);//递归回溯,回溯后还原数据
num--;
sum-=a[k][j];
visted[k][j]=0;
visted[j][k]=0;
}
}
}
int main()
{
cin>>t;
while(t--)
{
cin>>n>>m>>s>>e;
for(int i=1;i<=m;i++)
{
cin>>a1>>b>>c;
a[b][c]=a1;
a[c][b]=a1;
if(x<max(b,c)) x=max(b,c);//统计节点的个数
}
bl(s,num);
cout<<min1<<endl;
}
return 0;
}