*2.(最小环问题)给定一张无向图,求图中一个至少包含 3 个点的环,环上的节点不重复,并且环上的边的长度之和最小。该问题称为无向图的最小环问题。在本题中,你需要输出最小环的方案,若最小环不唯一,输出任意一个均可。若无解,输出 No solution.
图的节点数不超过 100100。
输入:
第一行两个正整数 n,m 表示点数和边数。
接下来 m 行,每行三个正整数 x,y,z,表示节点 x,y之间有一条长度为 z 的边。
输出:
一个最小环的方案:按环上顺序输出最小环上的点。若最小环不唯一,输出任意一个均可。若无解,输出 No solution.
#include
#define MAXN 105
#define INF 0x3f3f3f3f
using namespace std;
inline int read(){
int x=0,f=1;
char ch=getchar();
while (ch'9'){
if (ch=='-') f=-1;
ch=getchar();
}
while (ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+(ch^'0');
ch=getchar();
}
return x*f;}
static int stk[MAXN],top;
static int pos[MAXN][MAXN];//表示i~j的中点节点
#define Push(x) stk[++top]=(x);
void GetAns(int i,int j){
if (pos[i][j]==0) return ;
GetAns(i,____1____);
Push(pos[i][j]);
GetAns(pos[i][j],____2____);}
static int G[MAXN][MAXN],D[MAXN][MAXN];
int main(){
int n=read(),m=read();
memset(G,0x3f,sizeof(G));
memset(D,0x3f,sizeof(D));
for (register int i=1;i<=m;++i){
int u=read(),v=read();
D[v][u]=D[u][v]=G[u][v]=G[v][u]=min(G[u][v],read());
}
int ans=INF;
for (register int k=1;k<=n;++k){
for (register int i=1;i
for (register int j=i+1;j
if (D[i][j]==INF||G[j][k]==INF||G[k][i]==INF) continue;
if (D[i][j]+G[j][k]+G[k][i]
ans=_____3_____;
top=0;Push(i);GetAns(i,j);Push(j);Push(k);
}
}
}
for (register int i=1;i<=n;++i){
for (register int j=1;j<=n;++j){
if (_____4_____){
D[i][j]=D[i][k]+D[k][j];
pos[i][j]=k;
}
}
}
}
if (ans==INF) return puts("No solution."),0;
for (register int i=1;i<=top;++i) printf("%d ",_____5____);}
1.1上述程序___1___中应该填写()