最短路径树

a

#include<bits/stdc++.h>
using namespace std;
const int N=105,INF=1e8;
int n,m,ANS,a[N][N],d[N][N],pos[N][N];
vector<int>ans;

void get_path(int x,int y) {
    if(!pos[x][y]) return ;
    get_path(x,pos[x][y]);
    ans.push_back(pos[x][y]);
    get_path(pos[x][y],y);
}

int main() {
    scanf("%d%d",&n,&m);
    memset(a,0x3f,sizeof(a));
    int x,y,z;
    for(int i=1;i<=m;i++) {
        scanf("%d%d%d",&x,&y,&z);
        a[x][y]=a[y][x]=min(a[x][y],z);
    }
    ANS=INF;
    memcpy(d,a,sizeof(d));
    for(int k=1;k<=n;k++) {
        for(int i=1;i<k;i++)
         for(int j=i+1;j<k;j++) 
          if((long long)d[i][j]+a[j][k]+a[k][i]<ANS) {
            ANS=d[i][j]+a[j][k]+a[k][i];
            ans.clear();
            ans.push_back(i);
            get_path(i,j);
            ans.push_back(j);
            ans.push_back(k);
          }
        for(int i=1;i<=n;i++)
         for(int j=1;j<=n;j++) 
          if(d[i][k]+d[k][j]<d[i][j]) {
            d[i][j]=d[i][k]+d[k][j];
            pos[i][j]=k;
          }
    }
    if(ANS==INF) return puts("No solution."),0;
    for(int i=0;i<ans.size();i++) 
     printf("%d ",ans[i]);
}

 

猜你喜欢

转载自www.cnblogs.com/qq8260573/p/10375143.html
0条评论
添加一条新回复
  
今日推荐