最短路径问题,Floyd算法。英文较难看懂,数据处理比较困难。
CODE:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
const int SIZE = 101;
const int INF = 0x3fffffff;
int n;
int d[SIZE][SIZE], sea[SIZE];
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(d[i][j] <= INF && d[k][j] <= INF) d[i][j] <?= d[i][k] + d[k][j]; // < INF会报错。
}
void init()
{
int i, j;
memset(sea, 0, sizeof(sea));
for(i = 0; i < SIZE; i++)
{
for(j = 0; j < SIZE; j++)
{
d[i][j] = (i == j)?0:INF;
}
}
return ;
}
int main()
{
int i, j;
int road;
while(~scanf("%d", &n))
{
init();
for(i = 0; i < n; i++)
{
scanf("%d%d", &road, &sea[i]);
while(road--)
{
int cost, link;
scanf("%d%d", &link, &cost);
d[i][link] = d[link][i] = cost;
}
}
Floyd();
int min = INF;
for(i = 0; i < n; i++)
{
if(sea[i]) min <?= d[0][i];
}
printf("%d\n", min);
}
return 0;
}
#include <stdlib.h>
#include <string.h>
using namespace std;
const int SIZE = 101;
const int INF = 0x3fffffff;
int n;
int d[SIZE][SIZE], sea[SIZE];
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(d[i][j] <= INF && d[k][j] <= INF) d[i][j] <?= d[i][k] + d[k][j]; // < INF会报错。
}
void init()
{
int i, j;
memset(sea, 0, sizeof(sea));
for(i = 0; i < SIZE; i++)
{
for(j = 0; j < SIZE; j++)
{
d[i][j] = (i == j)?0:INF;
}
}
return ;
}
int main()
{
int i, j;
int road;
while(~scanf("%d", &n))
{
init();
for(i = 0; i < n; i++)
{
scanf("%d%d", &road, &sea[i]);
while(road--)
{
int cost, link;
scanf("%d%d", &link, &cost);
d[i][link] = d[link][i] = cost;
}
}
Floyd();
int min = INF;
for(i = 0; i < n; i++)
{
if(sea[i]) min <?= d[0][i];
}
printf("%d\n", min);
}
return 0;
}