0%

UVA1056题解

一.题目大意

给你 $n$ 个名字, $m$ 个关系,求每个名字连成的图的最短路的最短权值,若图不连通,输出 DISCONNECTED

二.题目分析

我们可以用 STL 中的 map 将每个名字映射到一个整数,接着就是一道裸的最短路问题,考虑到很小的数据范围,可以用 Floyd 解决,复杂度 $O(n^3)$。

三. 代码注释

注意多测清空和毒瘤的输出格式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include<bits/stdc++.h>
using namespace std;
int f[1001][1001];
map<string,int>ma;
int n,m,cnt,cas;
void init(){
memset(f,0x3f,sizeof f);
ma.clear();
cnt=0;
}//多测不清空,亲人两行泪
int main()
{ while(1){
init();
cin>>n>>m;
printf("Network %d: ", ++cas);
if(n==0&&m==0)return 0;
for(int i=i;i<=m;i++){
string x,y;
cin>>x>>y;
if(ma.find(x)==ma.end()){ma[x]=++cnt;}
if(ma.find(y)==ma.end()){ma[y]=++cnt;}//map将每个字符串映射为一个整数,方便存图
int xx=ma[x],yy=ma[y];
f[xx][yy]=1;
f[yy][xx]=1;//存图
f[i][i]=0;//顺手将矩阵预处理
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
}
}
}//Floyd
int ans=0;bool flag=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i!=j)ans=max(f[i][j],ans);
if(f[i][j]==0x3f3f3f3f){
flag=1;
break;
}
}
}
if(!flag){
cout<<ans<<endl<<endl;//注意空行
}
else{
puts("DISCONNECTED");
puts("");
}
}
return 0;
}