关键代码:
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
d[i][j]=100000;
if(i==j) d[i][j]=0;
}
}
.......
for(int k=0;k<n;k++)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
}
}
完整代码:(51nod 1459)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int d[505][505];
int c[505][505];
int s[505];
int main()
{
int n,m,start,endd;
scanf("%d%d%d%d",&n,&m,&start,&endd);
if(n==1)
{
int ans;
scanf("%d",&ans);
while(m--)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
}
printf("%d %d\n",0,ans);
return 0;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
d[i][j]=100000;
if(i==j) d[i][j]=0;
}
}
for(int i=0;i<n;i++) {scanf("%d",&s[i]);}
for(int i=0;i<m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
d[x][y]=z;
d[y][x]=z;
c[x][y]=s[x]+s[y];
c[y][x]=s[x]+s[y];
}
for(int k=0;k<n;k++)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
//d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
if(d[i][k]+d[k][j]<d[i][j])
{
d[i][j]=d[i][k]+d[k][j];
c[i][j]=c[i][k]+c[k][j]-s[k];
}
else if(d[i][k]+d[k][j]==d[i][j])
{
c[i][j]=max(c[i][j],c[i][k]+c[k][j]-s[k]);
}
}
}
}
printf("%d %d\n",d[start][endd],c[start][endd]);
return 0;
}