#include<stdio.h>
#include<stdlib.h>
int map[101][101]={0};
int Data[101]={0};//已标记
int done[101]={0};//已操作
int lenth[101]={0};//记录顶点路径长
int sum[101]={0};//每次遍历最远路径
int check1(int N){
int i;
for(i=1;i<=N;i++){
if(Data[i]==0)
return 1;
}
return 0;
}
int check2(int N){
int i;
for(i=1;i<=N;i++){
if(done[i]==0)
return 1;
}
return 0;
}
int findlim(int N){//从图中找到最小路径顶点 并确认
int i;
int a=-1;
for(i=1;i<=N;i++){
if(Data[i]&&!done[i]){
if(a==-1)
a=i;
else{
if(lenth[i]<lenth[a])
a=i;
}
}
}
return a;
}//finlim right
void sure(int lim,int N){
int i;
for(i=1;i<=N;i++){
if(Data[i]&&map[i][lim]){
if(lenth[lim]>lenth[i]+map[lim][i])
lenth[lim]=lenth[i]+map[lim][i];
}
}
done[lim]=1;
}
int research(int N,int hang){
int i,lim,n=0,max;
for(i=1;i<=N;i++){
Data[i]=0;
lenth[i]=10000;
done[i]=0;
}
Data[hang]=1;
lenth[hang]=0;
while(check2(N)){
lim=findlim(N);
for(i=1;i<=N;i++){
if(!Data[i]&&map[lim][i]){
lenth[i]=lenth[lim]+map[lim][i];
Data[i]=1;
}
}
sure(lim, N);
n++;
if(n>N){
break;
}
}
if(n>N)
return 0;
max=lenth[1];
for(i=2;i<=N;i++){
if(lenth[i]>max)
max=lenth[i];
}
return max;
}
int main(){
int N,M;
int i,VE1,VE2,weight;
scanf("%d %d",&N,&M);
for(i=0;i<M;i++){
scanf("%d %d %d",&VE1,&VE2,&weight);
map[VE1][VE2]=map[VE2][VE1]=weight;
}
for(i=1;i<=N;i++){
sum[i]=research(N, i);
if(sum[i]==0){
printf("0");
return 0;
}
}
M=1;
for(i=1;i<=N;i++){
if(sum[i]<sum[M])
M=i;
}
printf("%d %d",M,sum[M]);
return 0;
}
算法就是多次求每个动物的最长魔法口诀长度 然后选取最短的。
但是最后一个怎么都过不去 百思不解 求大神求助