一个人的旅行
2015-05-03 10:38
239 查看
http://acm.hdu.edu.cn/showproblem.php?pid=2066
//floyd
#include<stdio.h>
#include<string.h>
int e[1010][1010],start[1010],end[1010];
int main()
{
int aa,time,a,b,t,s,d,i,j,k,inf=99999999,min,n;
while(scanf("%d%d%d",&t,&s,&d)!=EOF)
{
for(i=1;i<=1000;i++)
for(j=1;j<=1000;j++)
if(i==j)
e[i][j]=0;
else
e[i][j]=inf;
n=0;
for(i=1,j=1;i<=t;i++)
{
scanf("%d%d%d",&a,&b,&time);
if(a>n)
n=a;
if(b>n)
n=b;
if(e[a][b]>time)
{
e[a][b]=time;
e[b][a]=time;
}
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(e[j][i]==inf)
continue;
for(k=1;k<=n;k++)
if(e[j][k]>e[j][i]+e[i][k])
e[j][k]=e[j][i]+e[i][k];
}
for(i=1;i<=s;i++)
scanf("%d",start+i);
for(i=1;i<=d;i++)
scanf("%d",end+i);
min=inf;
for(i=1;i<=s;i++)
for(j=1;j<=d;j++)
if(e[start[i]][end[j]]<min)
min=e[start[i]][end[j]];
printf("%d\n",min);
}
return 0;
}
////////////////////////////////////////////////////////////
floyd1
#include<stdio.h>
#include<string.h>
int e[1010][1010],start[1010],end[1010],sign1[1010];
int main()
{
int time,a,b,t,s,d,i,j,k,inf=99999999,min,n,temp,j1,j2;
while(scanf("%d%d%d",&t,&s,&d)!=EOF)
{
for(i=1;i<=1000;i++)
for(j=1;j<=1000;j++)
if(i==j)
e[i][j]=0;
else
e[i][j]=inf;
memset(sign1,0,sizeof(sign1));
for(i=1,j=1;i<=t;i++)
{
scanf("%d%d%d",&a,&b,&time);
if(!sign1[a])
sign1[a]=j++;
if(!sign1[b])
sign1[b]=j++;
if(e[sign1[a]][sign1[b]]>time)
{
e[sign1[a]][sign1[b]]=time;
e[sign1[b]][sign1[a]]=time;
}
}
n=j-1;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(e[j][i]==inf)
continue;
for(k=1;k<=n;k++)
if(e[j][k]>e[j][i]+e[i][k])
e[j][k]=e[j][i]+e[i][k];
}
for(i=1,j1=1;i<=s;i++)
{
scanf("%d",&temp);
if(sign1[temp]!=0)
start[j1++]=temp;
}
for(i=1,j2=1;i<=d;i++)
{
scanf("%d",&temp);
if(sign1[temp]!=0)
end[j2++]=temp;
}
min=inf;
for(i=1;i<j1;i++)
for(j=1;j<j2;j++)
if(e[sign1[start[i]]][sign1[end[j]]]<min)
min=e[sign1[start[i]]][sign1[end[j]]];
printf("%d\n",min);
}
return 0;
}
////////////////////////////////////////////////////////////////////////////////
Dijkstra
#include<stdio.h>
#include<string.h>
int vis[1010],e[1010][1010],start[1010],end[1010],dis[1010];
int main()
{
int a,b,time,t,s,d,i,j,k,n,min,inf=99999999,u,mmin;
while(scanf("%d%d%d",&t,&s,&d)!=EOF)
{
for(i=1;i<=1000;i++)
for(j=1;j<=1000;j++)
if(i==j)
e[i][j]=0;
else
e[i][j]=inf;
n=0;
for(i=1;i<=t;i++)
{
scanf("%d%d%d",&a,&b,&time);
if(a>n)
n=a;
if(b>n)
n=b;
if(time<e[a][b])
{
e[a][b]=time;
e[b][a]=time;
}
}
for(i=1;i<=s;i++)
scanf("%d",start+i);
for(i=1;i<=d;i++)
scanf("%d",end+i);
mmin=inf;
for(i=1;i<=s;i++)
{
memset(vis,0,sizeof(vis));
vis[start[i]]=1;
for(j=1;j<=n;j++)
dis[j]=e[start[i]][j];
for(j=1;j<=n-1;j++)
{
min=inf;
for(k=1;k<=n;k++)
if(!vis[k] && dis[k]<min)
{
min=inf;
u=k;
}
vis[u]=1;
for(k=1;k<=n;k++)
if(dis[k]>dis[u]+e[u][k])
dis[k]=dis[u]+e[u][k];
}
for(j=1;j<=d;j++)
if(dis[end[j]]<mmin)
mmin=dis[end[j]];
}
printf("%d\n",mmin);
}
return 0;
}
http://acm.hdu.edu.cn/showproblem.php?pid=2066
//floyd
#include<stdio.h>
#include<string.h>
int e[1010][1010],start[1010],end[1010];
int main()
{
int aa,time,a,b,t,s,d,i,j,k,inf=99999999,min,n;
while(scanf("%d%d%d",&t,&s,&d)!=EOF)
{
for(i=1;i<=1000;i++)
for(j=1;j<=1000;j++)
if(i==j)
e[i][j]=0;
else
e[i][j]=inf;
n=0;
for(i=1,j=1;i<=t;i++)
{
scanf("%d%d%d",&a,&b,&time);
if(a>n)
n=a;
if(b>n)
n=b;
if(e[a][b]>time)
{
e[a][b]=time;
e[b][a]=time;
}
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(e[j][i]==inf)
continue;
for(k=1;k<=n;k++)
if(e[j][k]>e[j][i]+e[i][k])
e[j][k]=e[j][i]+e[i][k];
}
for(i=1;i<=s;i++)
scanf("%d",start+i);
for(i=1;i<=d;i++)
scanf("%d",end+i);
min=inf;
for(i=1;i<=s;i++)
for(j=1;j<=d;j++)
if(e[start[i]][end[j]]<min)
min=e[start[i]][end[j]];
printf("%d\n",min);
}
return 0;
}
////////////////////////////////////////////////////////////
floyd1
#include<stdio.h>
#include<string.h>
int e[1010][1010],start[1010],end[1010],sign1[1010];
int main()
{
int time,a,b,t,s,d,i,j,k,inf=99999999,min,n,temp,j1,j2;
while(scanf("%d%d%d",&t,&s,&d)!=EOF)
{
for(i=1;i<=1000;i++)
for(j=1;j<=1000;j++)
if(i==j)
e[i][j]=0;
else
e[i][j]=inf;
memset(sign1,0,sizeof(sign1));
for(i=1,j=1;i<=t;i++)
{
scanf("%d%d%d",&a,&b,&time);
if(!sign1[a])
sign1[a]=j++;
if(!sign1[b])
sign1[b]=j++;
if(e[sign1[a]][sign1[b]]>time)
{
e[sign1[a]][sign1[b]]=time;
e[sign1[b]][sign1[a]]=time;
}
}
n=j-1;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(e[j][i]==inf)
continue;
for(k=1;k<=n;k++)
if(e[j][k]>e[j][i]+e[i][k])
e[j][k]=e[j][i]+e[i][k];
}
for(i=1,j1=1;i<=s;i++)
{
scanf("%d",&temp);
if(sign1[temp]!=0)
start[j1++]=temp;
}
for(i=1,j2=1;i<=d;i++)
{
scanf("%d",&temp);
if(sign1[temp]!=0)
end[j2++]=temp;
}
min=inf;
for(i=1;i<j1;i++)
for(j=1;j<j2;j++)
if(e[sign1[start[i]]][sign1[end[j]]]<min)
min=e[sign1[start[i]]][sign1[end[j]]];
printf("%d\n",min);
}
return 0;
}
////////////////////////////////////////////////////////////////////////////////
Dijkstra
#include<stdio.h>
#include<string.h>
int vis[1010],e[1010][1010],start[1010],end[1010],dis[1010];
int main()
{
int a,b,time,t,s,d,i,j,k,n,min,inf=99999999,u,mmin;
while(scanf("%d%d%d",&t,&s,&d)!=EOF)
{
for(i=1;i<=1000;i++)
for(j=1;j<=1000;j++)
if(i==j)
e[i][j]=0;
else
e[i][j]=inf;
n=0;
for(i=1;i<=t;i++)
{
scanf("%d%d%d",&a,&b,&time);
if(a>n)
n=a;
if(b>n)
n=b;
if(time<e[a][b])
{
e[a][b]=time;
e[b][a]=time;
}
}
for(i=1;i<=s;i++)
scanf("%d",start+i);
for(i=1;i<=d;i++)
scanf("%d",end+i);
mmin=inf;
for(i=1;i<=s;i++)
{
memset(vis,0,sizeof(vis));
vis[start[i]]=1;
for(j=1;j<=n;j++)
dis[j]=e[start[i]][j];
for(j=1;j<=n-1;j++)
{
min=inf;
for(k=1;k<=n;k++)
if(!vis[k] && dis[k]<min)
{
min=inf;
u=k;
}
vis[u]=1;
for(k=1;k<=n;k++)
if(dis[k]>dis[u]+e[u][k])
dis[k]=dis[u]+e[u][k];
}
for(j=1;j<=d;j++)
if(dis[end[j]]<mmin)
mmin=dis[end[j]];
}
printf("%d\n",mmin);
}
return 0;
}
相关文章推荐
- HDU2066 一个人的旅行 解题报告--Dijkstra
- hdu2066一个人的旅行
- Hdu 2066 一个人的旅行
- HDU - 2066 - 一个人的旅行
- HDU-2066 一个人的旅行
- 一个人的旅行
- hdu2066 一个人的旅行
- hdu-2066 一个人的旅行
- HDU 2066 一个人的旅行(Dijkstra)
- hdu 2066 一个人的旅行
- 一个人的旅行
- HDU 2066-一个人的旅行(最短路Dijkstra)
- hdoj 2066 一个人的旅行 【多源多汇最短路】
- hdu 2066 一个人的旅行 Dijkstra
- HDU 2066 一个人的旅行
- 一个人的旅行
- hdu-2066 一个人的旅行(SPFA做法)
- HDU-2066 一个人的旅行
- HDU 2066 一个人的旅行(Dijkstra,建图很巧妙)
- hdu2066 一个人的旅行