我用的是Floyd算法求所有定点的最短边,这道题需要判重,由于我对于图论没啥经验,WA了N次。似乎判断d[i][j] + d[k][j]是否溢出的判断条件有小错误额。
CODE:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
const int SIZE = 1010;
const int INF = 0x3fffffff;
int d[SIZE][SIZE];
int n, m;
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) //有小错误? 如果改为 <INF则会WA
d[i][j] <?= d[i][k] + d[k][j];
}
void init()
{
for(int i = 0; i < SIZE ; i++)
{
for(int j = 0; j < SIZE; j++)
{
d[i][j] = (i == j? 0: INF); //初始化
}
}
return ;
}
int main()
{
int i, j;
int u, v, w1;
while(~scanf("%d", &n))
{
init();
for(scanf("%d", &m); m > 0; m--)
{
scanf("%d%d%d", &u, &v, &w1);
if(w1 < d[u][v]) //判重边,这里挺重要,2道题WA N次都是因为它。
d[u][v] = d[v][u] = w1;
}
Floyd();
scanf("%d%d", &u, &v);
printf(d[u][v] == INF?"-1\n":"%d\n", d[u][v]);
}
return 0;
}
#include <stdlib.h>
#include <string.h>
using namespace std;
const int SIZE = 1010;
const int INF = 0x3fffffff;
int d[SIZE][SIZE];
int n, m;
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) //有小错误? 如果改为 <INF则会WA
d[i][j] <?= d[i][k] + d[k][j];
}
void init()
{
for(int i = 0; i < SIZE ; i++)
{
for(int j = 0; j < SIZE; j++)
{
d[i][j] = (i == j? 0: INF); //初始化
}
}
return ;
}
int main()
{
int i, j;
int u, v, w1;
while(~scanf("%d", &n))
{
init();
for(scanf("%d", &m); m > 0; m--)
{
scanf("%d%d%d", &u, &v, &w1);
if(w1 < d[u][v]) //判重边,这里挺重要,2道题WA N次都是因为它。
d[u][v] = d[v][u] = w1;
}
Floyd();
scanf("%d%d", &u, &v);
printf(d[u][v] == INF?"-1\n":"%d\n", d[u][v]);
}
return 0;
}