Contest2037 - CSU Monthly 2013 Oct (problem D 1321: CX and girls)
你为何这么叼!
1321: CX and girls
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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
感谢学长大大的纠正傻逼的错误!
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 }
浙公网安备 33010602011771号