站外题求助
查看原帖
站外题求助
320470
William_Takazaki楼主2023/1/28 08:59

结果:全WA

题目描述

A国的边境上修建了 nn 座兵营(编号为 1n1 ∼ n ),某些兵营之间修建了用于传达消息的双向道路,不同的道路由于长度和平整度不同,也就可能需要不同的天数才能走完。

为方便指挥作战,A国将指挥所修建在了 11 号兵营。当指挥部下达作战指令后,指挥部就派出若干个传令兵,按照预先修好的道路,将指令传达给相邻的兵营。当一座兵营接到指令后,会按同样的方式向其他兵营传达指令,直到所有的兵营都收到作战指令。

请编程计算出,从指挥部发出作战指令到所有兵营都收到作战命令,最短需要多少天。

输入

第一行有两个整数 nnmm ,表示有 nn 个兵营和 mm 条道路。

22m+1m+1 行,每行三个整数 x,y,kx,y,k,表示第 xx 个和第 yy个兵营之间存在一条需要 kk 天才能走完的双向道路。

数据范围 1n1001≤n≤1001m5001≤m≤500

1x,yn1≤x,y≤n1k10001≤k≤1000

输出

输出所有兵营接到指令的最短天数,如果由于道路的缺失,导致无论如何都不能做到所有兵营都能接到指令,请输出 1−1

样例输入

4 4
1 2 4
2 3 7
2 4 1
3 4 6

样例输出

11

我的代码:

#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
int n,m,x,y,z,s=1,sum,a[110][110],i,j,d[110],minn;
bool f[110],f1[110],flag;
int main(){
	cin>>n>>m;
	for(i=1;i<=m;i++){
		cin>>x>>y>>z;
		a[x][y]=z;
		a[y][x]=z;
	}memset(d,inf,sizeof(d));
	do{
		d[s]=0;
		f[s]=true;
		for(i=1;i<=n;i++){
			minn=-1;
			for(j=1;j<=n;j++){
				if(f[j]==false&&(minn==-1||d[j]<d[minn]))minn=j;
			}f[minn]=true;
			for(j=1;j<=n;j++){
				if(f[j]==false&&a[minn][j]!=0&&d[minn]+a[minn][j]<d[j])d[j]=d[minn]+a[minn][j];
			}
		}int p=0,min=INT_MAX;
		for(i=1;i<=n;i++){
			if(i==s)continue;
			if(d[i]<min&&f[i]==false){
				min=d[i];
				p=i;
				f[i]=true;
			}
		}s=p;
		sum+=min;
		flag=false;
		for(i=1;i<=n;i++){
			if(!f[i]){
				flag=true;
				break;
			}
		}
	}while(flag);
	if(d[n]==inf)cout<<"-1";
	else cout<<sum;
	return 0;
}

咋办?

2023/1/28 08:59
加载中...