POJ 1797 Heavy Transportation(Dijkstra)

来源:互联网 发布:爱国者淘宝店下架 编辑:程序博客网 时间:2024/05/18 05:21

题目链接:POJ 1797

分析:和POJ 2253类似,求所有通路最大最短边长度。

用cin读入会超时,用Floyd算法也会超时。

在Dijkstra中的松弛方程为:

dis[j]=max(dis[j],min(dis[u],map[u][j]));


CODE:

//***************AC******************#include <iostream>#include <cmath>#include <algorithm>#include <cstdio>#include <cstring>using namespace std;const int maxnum=1005;int t,n,m;int dis[maxnum],vis[maxnum],map[maxnum][maxnum];int Dijkstra(int n,int dis[maxnum],int map[maxnum][maxnum]){memset(vis,0,sizeof(vis));for(int i=2;i<=n;i++)dis[i]=map[1][i];dis[1]=0,vis[1]=1;for(int i=1;i<n;i++){int u=1;int tmp=-1;for(int j=2;j<=n;j++){if((!vis[j])&&dis[j]>tmp){u=j;tmp=dis[j];}}vis[u]=1;for(int j=2;j<=n;j++){if((!vis[j])&&map[u][j]>-1)dis[j]=max(dis[j],min(dis[u],map[u][j]));}}return dis[n];}int main(){#ifdef LOCALfreopen("in.txt","r",stdin);#endif cin>>t;int cases=0,ans;while(t--){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){dis[i]=-1;for(int j=1;j<=n;j++)map[i][j]=-1;}int p,q,len;for(int i=1;i<=m;i++){scanf("%d%d%d",&p,&q,&len);if(len>map[p][q])map[p][q]=map[q][p]=len;}ans=Dijkstra(n,dis,map);printf("Scenario #%d:\n%d\n\n",++cases,ans);}return 0;}


//*************TLE********************#include <iostream>#include <cmath>#include <algorithm>#include <cstdio>#include <cstring>using namespace std;const int maxnum=1005;int t,dis[maxnum][maxnum],n,m;int Floyd(int n,int dis[maxnum][maxnum]){for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)dis[i][j]=max(dis[i][j],min(dis[i][k],dis[k][j]));}}return dis[1][n];}int main(){#ifdef LOCALfreopen("in.txt","r",stdin);#endif scanf("%d",&t);int cases=0,ans;while(t--){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)dis[i][j]=-1;}int p,q,len;for(int i=1;i<=m;i++){scanf("%d%d%d",&p,&q,&len);if(len>dis[p][q])dis[p][q]=dis[q][p]=len;}ans=Floyd(n,dis);printf("Scenario #%d:\n%d\n\n",++cases,ans);}return 0;}


0 0
原创粉丝点击