分别用dijkstra 和floyd做了。。奇怪的是,时间都是15MS
#include <iostream>
using namespace std;
#define N 12
int n, m;
int map[N][N];
int sea[N];
int D[N];
int flag[N];
void floyd()
{
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
for(int k = 0; k < n; k++)
{
if(map[j][i] + map[i][k] < map[j][k])
map[j][k] = map[j][i] + map[i][k];
}
}
void dijkstra()
{
for(int cnt = 0; cnt < n-1; cnt++)
{
int min = 0x7fffffff;
int index = -1;
for(int i = 0; i < n; i++)
{
if(D[i] < min && flag[i] == 0)
{
index = i;
min = D[i];
}
}
flag[index] = 1;
for(int i = 0; i < n; i++)
{
if(flag[i])
continue;
for(int j = 0; j < n; j++)
{
if(flag[j] == 0)
continue;
if(D[j] + map[j][i] < D[i])
D[i] = D[j] + map[j][i];
}
}
}
}
int main()
{
freopen("acm.txt", "r", stdin);
while(~scanf("%d", &n))
{
memset(sea, 0, sizeof(sea));
memset(flag, 0, sizeof(flag));//表示初始集合为空,被选中则为1
for(int i = 0; i < N; i++)
for(int j = 0; j < N; j++)
map[i][j] = 0x1fffffff;
for(int i = 0; i < n; i++)
{
int num;
scanf("%d%d", &num, &sea[i]);
for(int j = 0; j < num; j++)
{
int b, len;
scanf("%d %d", &b, &len);
map[i][b] = len;
}
}
for(int i = 0; i < n; i++)
D[i] = map[0][i];
/*floyd();
int min = 0x7fffffff;
for(int i = 0; i < n; i++)
{
if(sea[i])
if(map[0][i] < min)
min = map[0][i];
}
cout << min << endl;*/
dijkstra();
int min = 0x7fffffff;
for(int i = 0; i < n; i++)
{
if(sea[i])
if(D[i] < min)
min = D[i];
}
cout << min << endl;
}
return 0;
}