Floyd 算法求解,结果超时;
超时代码:
#include <cstdio>
#include <cstring>
#define INF 0xfffffff
#define max 1010
int dist[max][max],mone[max][max];
int n,m;
void Floyd ()
{
for (int k=1;k<=n;k++)
for (int i=1;i<=n;i++)
{
if (dist[i][k] != INF)
for (int j=1;j<=n;j++)
{
int tmp = dist[i][k]+dist[k][j];
if (tmp < dist[i][j])
{
dist[i][j] = tmp;
mone[i][j]= mone[i][k]+mone[k][j];
}
else if (tmp == dist[i][j] && mone[i][k]+mone[k][j] < mone[i][j])
mone[i][j] = mone[i][k]+mone[k][j];
}
}
}
int main ()
{
while (~scanf ("%d%d",&n,&m) && n && m)
{
int a,b,c,d;
for (int i=1;i<n;i++)
for (int j=i+1;j<=n;j++)
{
dist[i][j] = dist[j][i] = INF;
mone[i][j] = mone[j][i] = INF;
}
for (int i=1;i<=n;i++)
{
dist[i][i]=0;
mone[i][i]=0;
}
while (m--)
{
scanf ("%d%d%d%d",&a,&b,&c,&d);
if (c < dist[a][b])
{
dist[a][b] = dist[b][a] = c;
mone[a][b] = mone[b][a] = d;
}
}
scanf ("%d%d",&a,&d);
Floyd ();
printf ("%d %d\n",dist[a][d],mone[a][d]);
}
return 0;
}
Dijkstra 算法;
AC代码:
#include <cstdio>
#include <cstring>
#define INF 0xfffffff
#define max 1010
struct Node
{
int map[max][max]; //记录两个点之间的距离
int val[max][max]; //记录两个点之间的花费
int dist[max]; //记录点到原点的距离
int mon[max]; //记录点到原点的花费
}graph;
int n,m;
bool mark[max]; //标记被访问的点。
void Dijkstra (int s)
{
int k;
memset (mark,0,sizeof (mark));
for (int j=1;j<=n;j++)
{
graph.dist[j] = graph.map[s][j];
graph.mon[j] = graph.val[s][j];
}
mark[s] = true;
graph.dist[s] = 0;
graph.mon[s] = 0;
for (int i=1;i<=n;i++)
{
int min = INF;
for (int j=1;j<=n;j++)
{
if (!mark[j] && graph.dist[j] < min)
min=graph.dist[k=j];
}
mark[k] = true;
for (int index=1;index<=n;index++)
{
if (!mark[index] && graph.map[k][index] != INF)
{
int tmp = graph.map[k][index] + graph.dist[k];
if (tmp < graph.dist[index])
{
graph.dist[index] = tmp;
graph.mon[index] = graph.mon[k]+graph.val[k][index];
}
else if (tmp == graph.dist[index] && graph.mon[k]+graph.val[k][index] < graph.mon[index])
{
graph.mon[index] = graph.mon[k]+graph.val[k][index];
}
}
}
}
}
int main ()
{
while (~scanf ("%d%d",&n,&m) && n && m)
{
int a,b,c,d;
for (int i=1;i<n;i++)
for (int j=i+1;j<=n;j++)
{
graph.map[i][j] = graph.map[j][i] = INF;
graph.val[i][j] = graph.val[j][i] = INF;
}
while (m--)
{
scanf ("%d%d%d%d",&a,&b,&c,&d);
if (c < graph.map[a][b])
{
graph.map[a][b] = graph.map[b][a] = c;
graph.val[a][b] = graph.val[b][a] = d;
}
}
scanf ("%d%d",&a,&d);
Dijkstra (a);
printf ("%d %d\n",graph.dist[d],graph.mon[d]);
}
return 0;
}