Problem I

Problem Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?<br><br>
 

Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。<br>输入保证至少存在1条商店到赛场的路线。<br>
 

Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
 

Sample Input
  
  
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
 

Sample Output
  
  
3

2

代码:

#include<cstdio> #include<cstring> #include<utility> #include<queue> #include<vector> using namespace std; const int N=105; const int INF=9999999; typedef pair<int,int>pii; vector<pii>G[N]; priority_queue<pii, vector<pii>, greater<pii> >q; int d[N], first[N], u[N], v[N], w[N], next[N],n,m; bool vis[N]; // 无向图的输入,注意没输入的一条边要看作是两条边 void read_graph(){     for(int i=1; i<=n; ++i)         G[i].clear();     int a,b,c;     for(int i=1; i<=m; ++i){         scanf("%d%d%d",&a,&b,&c);         G[a].push_back(make_pair(b,c));         G[b].push_back(make_pair(a,c));     } } void Dijkstra(int src){     memset(vis, 0, sizeof(vis));     for(int i=1; i<=n; ++i) d[i] = INF;     d[src] = 0;     q.push(make_pair(d[src], src));     while(!q.empty()){         pii t = q.top(); q.pop();         int u = t.second;         if(vis[u]) continue;         vis[u] = true;         for(int v=0; v<G[u].size(); ++v)if(d[G[u][v].first] > d[u]+G[u][v].second){             d[G[u][v].first] = d[u]+G[u][v].second;             q.push(make_pair(d[G[u][v].first], G[u][v].first));         }     } } int main(){     int a,b,c;     while(~scanf("%d%d",&n,&m)&&n+m){         read_graph();         Dijkstra(1);         printf("%d\n", d[n]);     }     return 0; }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值