节约经费
时间限制: 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;
}