• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
HaibaraAi
博客园    首页    新随笔    联系   管理    订阅  订阅

Contest2037 - CSU Monthly 2013 Oct (problem D 1321: CX and girls)

你为何这么叼!

1321: CX and girls

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 256  Solved: 75
[Submit][Status][Web Board]

Description

  CX是要赶去上课,为了不迟到必须要以最短的路径到达教室,同时CX希望经过的路上能看到的学妹越多越好。现在把地图抽象成一个无向图,CX从1点出发,教室在N号点,告诉每个点上学妹的数量,每条边的长度。请你求出CX以最短路径赶到教室最多能看到多少学妹。

Input

  多组输入数据(最多20组),输入到文件结束。

  每组数据第一行两个正整数N,M其中N代表点的个数(2<=N<=1000),M代表边的个数(1<=M<=10000)。

  接下来一行N个数,代表着1~N每个点上学妹的个数,(0<=Ni<=50)。 接下来M行,每行三个数A B C(1<=A,B<=N,0<c<=100)代表A,B间有边,长度为C。(可能存在重边)

Output

  输出CX以最短距离从1到n的情况下能看到的最多学妹数量,若从点1无法到达点N输出-1。

Sample Input

4 4
1 2 3 4
1 2 1
1 3 1
2 4 2
3 4 2

Sample Output

8

HINT

CSU_ZZY

Source

CSU Monthly 2013 Oct.

 

感谢学长大大的纠正傻逼的错误!

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <vector>
 4 #include <queue>
 5 #include <algorithm>
 6 using namespace std;
 7 #define ll long long
 8 #define INF 0x7fffffff
 9 #define maxn 100005
10 #define mod 1000000007
11 int n,m;
12 struct Edge{int from,to,dist,cost;};
13 int x[maxn];
14 int d[maxn];
15 int p[maxn];
16 int in[maxn];
17 int cnt[maxn];
18 int cst[maxn];
19 vector<int>G[maxn];
20 vector<Edge>edges;
21 void init(){
22     for(int i=0;i<n;i++)G[i].clear();
23     edges.clear();
24 }
25 void AddEdge(int from,int to,int dist,int cost){
26     edges.push_back((Edge){from,to,dist,cost});
27     int m=edges.size();
28     G[from].push_back(m-1);
29 }
30 int SPFA(int s){
31     queue<int>q;
32     for(int i=0;i<n;i++)d[i]=INF;
33     memset(in,0,sizeof in);
34     memset(cst,0,sizeof cst);
35     memset(cnt,0,sizeof cnt);
36     d[s]=0;cst[0]=x[0];in[s]=1;
37     q.push(s);
38     while(!q.empty()){
39         int u=q.front();q.pop();
40         for(int i=0;i<G[u].size();i++){
41             Edge e=edges[G[u][i]];
42             if(((cst[e.to]<cst[u]+e.cost)&&(d[e.to]==d[u]+e.dist))||(d[e.to]>d[u]+e.dist)){
43                 cst[e.to]=cst[u]+e.cost;
44                 d[e.to]=d[u]+e.dist;
45                 if(!in[e.to]){
46                     in[e.to]=1;
47                     cnt[e.to]++;
48                     if(cnt[e.to]>=n)return 0;
49                     p[e.to]=G[u][i];
50                     q.push(e.to);
51                 }
52             }
53         }
54         in[u]=0;
55     }
56     return 1;
57 }
58 int main(){
59     init();
60         while(~scanf("%d%d",&n,&m)){
61         init();
62         for(int i=0;i<n;i++)scanf("%d",&x[i]);
63         for(int i=0;i<m;i++){
64             int a,b,v;
65             scanf("%d%d%d",&a,&b,&v);
66             a--;b--;
67             AddEdge(a,b,v,x[b]);
68             AddEdge(b,a,v,x[a]);
69         }
70         SPFA(0);
71         printf(d[n-1]==INF?"-1\n":"%d\n",cst[n-1]);
72     }
73     return 0;
74 }
View Code 2013-10-04 13:10:22 

 

posted @ 2013-10-04 13:13  HaibaraAi  阅读(126)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3