节约经费(dij)

节约经费

时间限制: 1 Sec   内存限制: 128 MB
提交: 2   解决: 0
[ 提交][ 状态][ 论坛]

题目描述

  N&B 大学是一所世界顶尖的大学,但是它有一个奇怪的规定那就是它只在每个城市招一名学生!   这不,高考的日子又快到了。N&B 大学管理层就已在策划招生工作的相关事宜了。N&B 大学以前每年都会为每个学生准备一张飞机票,以使学生更舒适的来到学校报到。但是由于受到经济危机的影响,今年他们不得不考虑节约更多的经费。但是他们又不想破坏给学生机票的这个惯例。经过 N&B 大学财务部的研究发现,在学生来学校的过程中,转机可能会可节约机票的费用。如 N&B 大学在 C 市,学生 S 在 B 市,B 市到 C 市的机票为 10000 元,但是 B 到 D 市的机票为 1000 元,D 到 C 市的机票为 2000 元,如果转机先从 B 到 D 再从 D 到 C 这样就比直接来 C 市节省了 7000 元!   现在己知 N&B 大学今年招生共 N(0 < N ≤ 1000)名,分别分布在N个城市(编号从 1 到 N(第 n 个学生在编号为 n 的城市),N&B 大学位于编号为T的城市(T ≤ N,与 N&B 大学在同一城市的学生,学校不需要为其购买机票),航空公司共有 M(M ≤ 100000)趟航班,每趟航班都连接两个城市,航班为单向的,且费用己知(0 < 费用 ≤ 100)。问 N&B 大学至少需要付出多少费用为新生购买机票?

输入

  第一行三个整数 n m t,表示共招收 n 名学生,共有 m 趟航班,N&B 大学坐落在 t 市。   以下 m 行每行包括三个整数 a b c,表示一趟从编号为 a 的城市到编号为 b 的城市航班费用为 c 元。输入数据保证所有学生都能通过航班到达学校所在城市。

输出

  N&B 大学为新生购买机票所需的最小花费。

样例输入

3 2 21 2 1003 2 100

样例输出

200
就是求最短路径了,直接dij算法求解就好了
#include<iostream>
#include<cstring>
using namespace std;
int g[1005][1005];
int dis[1005];
int vis[1005];
int n,m,t;
#define MM 9999999
void dij(){
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++)
        dis[i]=g[i][t];
    vis[t]=1;
    for(int i=1;i<n;i++){
        int min,v;
        min=MM;
        for(int j=1;j<=n;j++)
            if(!vis[j] && min>dis[j]){
                min=dis[j];
                v=j;
            }
        vis[v]=1;
        for(int j=1;j<=n;j++)
            if(dis[j]>dis[v]+g[j][v])
                dis[j]=dis[v]+g[j][v];
    }
}
int main(){
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    while(cin>>n>>m>>t){
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                if(i==j)
                    g[i][j]=0;
                else
                    g[i][j]=MM;
        for(int i=0;i<m;i++){
            int a,b,l;
            cin>>a>>b>>l;
            g[a][b]=l;
        }
        dij();
        int ans=0;
        for(int i=1;i<=n;i++)
            ans+=dis[i];
        cout<<ans<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值