2 条题解
-
0
#include<bits/stdc++.h> using namespace std; typedef long long LL; LL mp[210][210],mpp[15][15],f[1<<14][15]; int a[15],d[15]; int main() { int m,n;scanf("%d%d",&m,&n); memset(mp,63,sizeof(mp)); for(int k=1,x,y;k<=m;k++) { long long c;scanf("%d%d%lld",&x,&y,&c); mp[x][y]=mp[y][x]=min(mp[x][y],c); } int p;scanf("%d",&p);for(int i=1;i<=p;i++)scanf("%d",&a[i]); sort(a+1,a+p+1); if(a[p]!=n)a[++p]=n; if(a[1]!=1)a[++p]=1;//点1是出发点,点n是结束点,如果1和n不是宝藏点,那么也要加入a数组 sort(a+1,a+p+1); for(int k=1;k<=n;k++) for(int i=1;i<=n;i++)if(i!=k) for(int j=1;j<=n;j++)if(j!=k&&j!=i) mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]); //用Floyd算法使得mp数组为任意两个点最短的距离值 memset(mpp,63,sizeof(mpp)); for(int i=1;i<=p;i++)for(int j=1;j<=p;j++)mpp[i][j]=mp[a[i]][a[j]]; //用所有宝藏点重新构图 memset(f,63,sizeof(f));f[1][1]=0; d[1]=1;for(int i=2;i<=p;i++)d[i]=d[i-1]*2; for(int s=0;s<(1<<p);s++) for(int j=1;j<=p;j++)if(s&d[j]) for(int k=1;k<=p;k++)if((j!=k)&&(s&d[k])) f[s][j]=min(f[s][j],f[s-d[j]][k]+mpp[k][j]); if(f[(1<<p)-1][p]==f[0][0])printf("-1\n"); else printf("%lld\n",f[(1<<p)-1][p]); return 0; } -
0
#include<bits/stdc++.h> using namespace std; typedef long long LL; LL mp[210][210],mpp[15][15],f[1<<14][15]; int a[15],d[15]; int main() { int m,n;scanf("%d%d",&m,&n); memset(mp,63,sizeof(mp)); for(int k=1,x,y;k<=m;k++) { long long c;scanf("%d%d%lld",&x,&y,&c); mp[x][y]=mp[y][x]=min(mp[x][y],c); } int p;scanf("%d",&p);for(int i=1;i<=p;i++)scanf("%d",&a[i]); sort(a+1,a+p+1); if(a[p]!=n)a[++p]=n; if(a[1]!=1)a[++p]=1;//点1是出发点,点n是结束点,如果1和n不是宝藏点,那么也要加入a数组 sort(a+1,a+p+1); for(int k=1;k<=n;k++) for(int i=1;i<=n;i++)if(i!=k) for(int j=1;j<=n;j++)if(j!=k&&j!=i) mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]); //用floyed算法使得mp数组为任意两个点最短的距离值 memset(mpp,63,sizeof(mpp)); for(int i=1;i<=p;i++)for(int j=1;j<=p;j++)mpp[i][j]=mp[a[i]][a[j]]; //用所有宝藏点重新构图 memset(f,63,sizeof(f));f[1][1]=0; d[1]=1;for(int i=2;i<=p;i++)d[i]=d[i-1]*2; for(int s=0;s<(1<<p);s++) for(int j=1;j<=p;j++)if(s&d[j]) for(int k=1;k<=p;k++)if((j!=k)&&(s&d[k])) f[s][j]=min(f[s][j],f[s-d[j]][k]+mpp[k][j]); if(f[(1<<p)-1][p]==f[0][0])printf("-1\n"); else printf("%lld\n",f[(1<<p)-1][p]); return 0; }
- 1
信息
- ID
- 827
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 8
- 标签
- 递交数
- 155
- 已通过
- 26
- 上传者