1 条题解
-
0
#include<iostream> #include<algorithm> #include<cstring> #define MAX 0x3f3f3f3f #define ll long long using namespace std; int path[310][310],dis[310][310],points[310][310],way[310][310],e,v; int ans[310],sn=0; void init() { memset(dis,0x3f,sizeof(dis));//将每个字节赋值为0x3f memset(points,0x3f,sizeof(points)); cin>>v>>e; for(int i=1; i<=v; i++) dis[i][i]=points[i][i]=0; for(int i=1; i<=e; i++) { int a,b,w; cin>>a>>b>>w; dis[a][b]=dis[b][a]=min(dis[a][b],w); points[a][b]=points[b][a]=dis[a][b]; } } void getway(int x,int y) { if(way[x][y]==0) { return ; } getway(x,way[x][y]);//前 ans[++sn]=way[x][y];//中 getway(way[x][y],y);//后 } void solve1() { int minn=MAX; for(int k=1; k<=v; k++) { for(int i=1; i<k; i++) for(int j=i+1; j<k; j++) //i!=j { if(minn>(ll)dis[i][j]+points[k][i]+points[j][k]) { minn=dis[i][j]+points[k][i]+points[j][k]; sn=0; ans[++sn]=i; getway(i,j); ans[++sn]=j; ans[++sn]=k; } } for(int i=1; i<=v; i++) for(int j=1; j<=v; j++) //具有对称性 { if(dis[i][j]>(ll)dis[i][k]+dis[k][j]) { dis[i][j]=dis[i][k]+dis[k][j]; way[i][j]=k;//标志下一个目标点 } } } if(minn>=MAX) { cout<<"No solution."<<endl; } else { for(int i=1; i<=sn; i++) cout<<ans[i]<<' '; cout<<endl; } } int main() { init(); solve1(); }
- 1
信息
- ID
- 950
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者