您的位置:首页 > Web前端 > JavaScript

poj1797

2016-08-18 10:27 399 查看
Problem: Heavy Transportation

Description :给出N个城市M条边,每条边都有个容量,求一条运输路线,使得从城市1到城市N的运输量最大。运输量取决于这条路线上运输量最少的那条路。

Solution :用dijskstra算法对松弛条件变形即可。

Code(C++) (邻接矩阵实现):

#include <iostream>
#include <cstring>
#define N 1500
#define inf 0x3f3f3f3f

using namespace std;

int pic

;
int visit
;
int dis
,n;

void dijkstra(int src)
{
memset(visit,0,sizeof(visit));
for(int i=0; i<n; i++)
dis[i]=pic[src][i];
visit[src]=1;
for(int i=0; i<n; i++)
{
int tmp=-inf,k=0;
for(int j=0; j<n; j++)
if(!visit[j]&&tmp<dis[j])
{
tmp=dis[j];
k=j;
}
visit[k]=1;
for(int j=0; j<n; j++)
if(!visit[j]&&dis[k]<=pic[k][j])
{
int q=dis[k];
if(q>dis[j])
dis[j]=q;
}
else if(!visit[j]&&dis[k]>pic[k][j])
{
int q=pic[k][j];
if(q>dis[j])
dis[j]=q;
}
}
}

int main()
{
int T,m,cnt;
int weight,a,b;
cin>>T;
cnt=1;
while(T--)
{
memset(pic,-inf,sizeof(pic));
cin>>n>>m;
while(m--)
{
cin>>a>>b>>weight;
pic[a-1][b-1]=pic[b-1][a-1]=weight;
}
dijkstra(0);
cout<<"Scenario #"<<cnt++<<":"<<endl;
cout<<dis[n-1]<<endl<<endl;
}
return 0;
}


Code(C++) (邻接表实现):

#include <iostream>
#include <cstring>
#define N 1500
#define  inf 0x3f3f3f3f

using namespace std;

int dis
,n;
int visit
;
int head
,t;

struct edge
{
int u;
int v;
int cost;
int next;
} e[N*N];

void addedge(int u,int v,int c)
{
e[t].u=u;
e[t].v=v;
e[t].cost=c;
e[t].next=head[u];
head[u]=t++;
}

void dijkstra(int src)
{
memset(visit,0,sizeof(visit));
memset(dis,-inf,sizeof(dis));
for(int i=head[src];i!=-1;i=e[i].next)
dis[e[i].v]=e[i].cost;
visit[src]=1;
for(int i=1; i<=n; i++)
{
int tmp=-inf,k=0;
for(int j=1; j<=n; j++)
if(!visit[j]&&tmp<dis[j])
{
tmp=dis[j];
k=j;
}
visit[k]=1;
for(int j=head[k];j!=-1;j=e[j].next)
{
if(!visit[e[j].v]&&dis[k]>=e[j].cost)
{
int q=e[j].cost;
if(q>dis[e[j].v])
dis[e[j].v]=q;
}
if(!visit[e[j].v]&&dis[k]<e[j].cost)
{
int q=dis[k];
if(q>dis[e[j].v])
dis[e[j].v]=q;
}
}
}

}

int main()
{
int T,m,cnt=1;
int a,b,weight;
cin>>T;
while(T--)
{
t=1;
memset(head,-1,sizeof(head));
cin>>n>>m;
while(m--)
{
cin>>a>>b>>weight;
addedge(a,b,weight);
addedge(b,a,weight);
}
dijkstra(1);
cout<<"Scenario #"<<cnt++<<":"<<endl;
cout<<dis
<<endl<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj dijsktstra