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[N][N];
int visit[N];
int dis[N],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],n;
int visit[N];
int head[N],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[n]<<endl<<endl;
}
return 0;
}