hdu 1599 find the mincost route(dijkstra||floyed)
hdu 1599 find the mincost route
http://acm.hdu.edu.cn/showproblem.php?pid=1599
接下来的M行里,每行包括3个整数a,b,c.代表a和b之间有一条通路,并且需要花费c元(c <= 100)。
//dijkstra算法AC代码
#include<iostream>
#define INF 999999
#define MAXN 110
using namespace std;
int map[MAXN][MAXN],dis[MAXN],v[MAXN];
void dijkstra(int s,int n)
{
int i,k,MIN,j;
for(i=1;i<=n;i++)
dis[i]=map[s][i];
memset(v,0,sizeof(v));
v[s]=1;
dis[s]=0;
for(i=2;i<=n;i++)
{
k=s;
MIN=INF;
for(j=1;j<=n;j++)
if(!v[j]&&MIN>dis[j])
{
k=j;
MIN=dis[j];
}
v[k]=1;
for(j=1;j<=n;j++)
if(!v[j]&&map[k][j]<INF)
{
if(dis[j]>map[k][j]+dis[k])
dis[j]=map[k][j]+dis[k];
}
}
}
int main()
{
int n,m,a,b,c;
while(~scanf("%d%d",&n,&m))
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map[i][j]=INF;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(map[a][b]>c)
map[a][b]=map[b][a]=c;
}
int MIN=INF,temp,res;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(map[i][j]!=INF)
{
temp=map[i][j];
map[i][j]=map[j][i]=INF;
dijkstra(i,n);
if(MIN>dis[j]+temp)
MIN=dis[j]+temp;
map[i][j]=map[j][i]=temp;
}
}
}
if(MIN==INF)
puts("It's impossible.");
else
printf("%d\n",MIN);
}
return 0;
}
//floyd算法
#include<iostream>
#define INF 999999
#define MAXN 110
using namespace std;
int map[MAXN][MAXN],MIN,dis[MAXN][MAXN];
void floyd(int n)
{
int i,j,k;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
dis[i][j]=map[i][j];
for(k=1;k<=n;k++)
{
for(i=1;i<=k;i++)
for(j=1;j<i;j++)
if(MIN>dis[i][j]+map[i][k]+map[k][j])
MIN=dis[i][j]+map[i][k]+map[k][j];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(dis[i][j]>dis[i][k]+dis[k][j])
dis[i][j]=dis[i][k]+dis[k][j];
}
}
int main()
{
int n,m,a,b,c;
while(~scanf("%d%d",&n,&m))
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map[i][j]=INF;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(map[a][b]>c)
map[a][b]=map[b][a]=c;
}
MIN=INF;
floyd(n);
if(MIN==INF)
puts("It's impossible.");
else
printf("%d\n",MIN);
}
return 0;
}