日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

郊区春游题解

發布時間:2023/12/3 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 郊区春游题解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

郊區春游

題意:

給定一張圖,求從某個起點出發,經過其中R個點(R個點給出)的最短路徑(每個點經過且只經過一遍)

題解:

首先我們用floyed處理出任意兩點的距離
dp[i][j]表示當前狀態為i,當前所在的目標城市為j的最短路徑
i為01串,1表示該點走過,0表示沒走過
從點x到點y,
城市x已經走過:城市x是編號j的,所以(i&(1<<j))== 1,i的第j位是1,說明x走過
y還未走,所以(i&(1<<k)) == 0,i的第k位是0,說明y還沒走,下一步可以走
轉移方程:

dp[i+(1<<k)][k]=min(dp[i+(1<<k)][k],dp[i][j]+dist[x][y]);

代碼:

#include<bits/stdc++.h> #define debug(a,b) printf("%s = %d\n",a,b) typedef long long ll; using namespace std;inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w; } const int inf=0x3f3f3f; const int maxn=210; int dp[41000][17]; int dis[maxn][maxn]; int a[maxn]; int main() {memset(dis,inf,sizeof(dis));memset(dp,inf,sizeof dp);int n,m,r;cin>>n>>m>>r;for(int i=0;i<r;i++)cin>>a[i];for(int i=1;i<=m;i++){int x,y,w;cin>>x>>y>>w;dis[x][y]=dis[y][x]=w;}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){for(int k=1;k<=n;k++){if(i==j||j==k||i==k)continue;dis[j][k]=min(dis[j][k],dis[j][i]+dis[i][k]);}}}for(int i=0;i<r;i++)dp[1<<i][i]=0;//設置起點 int x,y;for(int i=1;i<(1<<r);i++)//枚舉所有狀態{for(int j=0;j<r;j++)//枚舉出發點 {if(!(i&(1<<j)))continue;//如果j沒走過 x=a[j];for(int k=0;k<r;k++)//枚舉到達點 {if(i&(1<<k))continue;//如果k還未走過 y=a[k];dp[i|(1<<k)][k]=min(dp[i|(1<<k)][k],dp[i][j]+dis[x][y]);}}}int minx=inf;for(int i=0;i<r;i++)minx=min(minx,dp[(1<<r)-1][i]);//(1<<r)-1表示r個點都經過的情況cout<<minx; }

總結

以上是生活随笔為你收集整理的郊区春游题解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。