城镇最多只有10个,可以用floyd解决
用vis[ i ] 表示该城镇是否靠海。
#include <iostream>
using namespace std;
int n,map[11][11];
const int INF = 99999999;
void floyd()
{
int i,j,k;
for(k = 0; k < n; k++)
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
if(map[i][k]!=INF && map[k][j]!=INF && map[i][k] + map[k][j] < map[i][j])
map[i][j] = map[i][k] + map[k][j];
}
int main()
{
int m,a,b,i,j,vis[15];
while(cin>>n)
{
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
{
if(i==j) map[i][j] = 0;
else map[i][j] = INF;
}
for(i = 0; i < n; i++)
{
cin>>m>>vis[i];
for(j = 0; j < m; j++)
{
cin>>a>>b;
map[i][a] = b;
}
}
floyd();
int ans = INF;
for(i = 0; i < n; i++)
{
if(vis[i] && map[0][i] < ans)
ans = map[0][i];
}
cout<<ans<<endl;
}
return 0;
}