您的位置:首页 > 编程语言 > Go语言

POJ 2263 Heavy Cargo

2010-10-28 15:01 387 查看
与2253相似,这道题求起点到终点的各条通路中,权值最小边的最大值

Floyd与Dijkstra都可以做

代码:

#include<iostream>
#include<map>
#include<string>
using namespace std;
int g[201][201],d[201],u[201];
int n,r;
int max(int a,int b)
{
return a>b?a:b;
}
int min(int a,int b)
{
return a<b?a:b;
}
void init()
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j)
{
g[i][j]=-1;
}
}
int main()
{
int i,j,k,cnt,st,end,w,a,b,t,test=0,mina;
char name1[50],name2[50];
while(cin>>n>>r&&n&&r)
{
test++;
memset(g,0,sizeof(g));
memset(d,0,sizeof(d));
memset(u,0,sizeof(u));
cnt=0;
map<string,int>mp;
init();
while(r--)
{
cin>>name1>>name2>>w;
a=mp[name1];
if(!a)
{
a=++cnt;
mp[name1]=a;
}
b=mp[name2];
if(!b)
{
b=++cnt;
mp[name2]=b;
}
g[a][b]=g[b][a]=w;
}
cin>>name1>>name2;
st=mp[name1];
end=mp[name2];
/*for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(g[i][k]&&g[k][j])
{
t=min(g[i][k],g[k][j]);
g[i][j]=max(g[i][j],t);
}
}*/
for(i=1;i<=n;i++)
{
if(g[st][i]>0)
d[i]=g[st][i];
else
d[i]=-1;
}
d[st]=0;
u[st]=1;
for(j=1;j<n;j++)
{
mina=999999;
for(i=1;i<=n;i++)
{
if(d[i]<mina&&!u[i]&&d[i]>0)
{
mina=d[i];
k=i;
}
}
u[k]=1;
for(i=1;i<=n;i++)
{
if(g[k][i]>0)
{
t=min(d[k],g[k][i]);
d[i]=max(t,d[i]);
}
}
}
cout<<"Scenario #"<<test<<endl;
cout<<d[end]<<" tons"<<endl<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: