HDU 3790 (最短路)

来源:互联网 发布:小清新调色思路 知乎 编辑:程序博客网 时间:2024/05/20 23:55

 

Floyd 算法求解,结果超时;

超时代码:

#include <cstdio>#include <cstring>#define INF 0xfffffff#define max 1010int 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 1010struct 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;}


 

0 0
原创粉丝点击