计算机csp考试模拟题,CSP-S初赛模拟题

*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___中应该填写()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值