您的位置:首页 > 理论基础 > 计算机网络

最短路径问题 多加了一个费用 http://acm.hdu.edu.cn/showproblem.php?pid=3790

2014-07-20 14:04 375 查看
#include<iostream>
#include<algorithm>
#include<cstdio>
#define INF 0x3f3f3f
using namespace std;
const int maxn = 1002;
int G[maxn][maxn],pay[maxn][maxn];
int dist[maxn],cost[maxn];
bool vis[maxn];
int n,m;
void  Prim(int x){

for(int i=1;i<=n;i++){
dist[i]=G[x][i];
cost[i]=pay[x][i];
vis[i]=0;
}
vis[x]=1;
while(1)
{
vis[0]=1,dist[0]=cost[0]=0;

int min2=INF,min1=INF,p;
for(int i=1;i<=n;i++){
if(!vis[i])
{
if(dist[i]<min2)
{
min2=dist[i];min1=cost[i];p=i;
}
else
{
if(dist[i]==min2&&cost[i]<min1)
{
min2=dist[i];min1=cost[i];p=i;
}

}
}
}
if(min2==INF)break;
vis[p]=1;
for(int i=1;i<=n;i++)
if(!vis[i])
{
if(dist[i]>G[p][i]+dist[p])
{
dist[i]=G[p][i]+dist[p];cost[i]=pay[p][i]+cost[p];
}
else
{
if((dist[i]==G[p][i]+dist[p])&&(cost[i]>pay[p][i]+cost[p]))
{
dist[i]=G[p][i]+dist[p];cost[i]=pay[p][i]+cost[p];
}
}
}
}

}
int main(){

while(scanf("%d%d",&n,&m)!=EOF&&(n||m)){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
{

G[i][j]=G[j][i]=INF;
G[i][i]=0;
pay[i][j]=pay[j][i]=INF;
pay[i][i]=0;
}
}
for(int i=1;i<=m;i++)
{
int a,b,v,k;
cin>>a>>b>>v>>k;
if(G[a][b]>v)
{
G[a][b]=G[b][a]=v;
pay[a][b]=pay[b][a]=k;
}
else
if(G[a][b]==v&&pay[a][b]>k) G[a][b]=G[b][a]=v,pay[a][b]=pay[b][a]=k;
}
int n1,m1;
cin>>n1>>m1;
Prim(n1);
cout<<dist[m1]<<" "<<cost[m1]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: