2014CSU-ACM暑假集训训练赛--七夕专场

A题目来源:http://codeforces.com/problemset/problem/20/C

     A题是跟一般的单源最短路径一样,SPFA算法即可,就是多了一个路径的的输出,记录父亲节点就行,不过数

据类型有点小坑,改成long long就行。第一次拿到firstblood啊!

 

B题目来源:http://codeforces.com/problemset/problem/295/B

     B题采用Floyd算法,当时没想出来,听了题解报告才会做的,对于删除顶点顺序可以采用反过来计算。正所谓

正难则反就是这个道理吧。然后计算出当前有向图各对顶点的最小路径之和,最后又按照原始删除顶点的顺序依次

把ans输出。

 

D题目来源:http://codeforces.com/problemset/problem/4/C

     考察map的用法,确实很方便。

 

F题目来源:http://codeforces.com/problemset/problem/4/C

     给我们的签到题,看懂题目就可以了。

 

 1 /*CodeForces 20C*/
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<queue>
 5 #define INF 300000000000
 6 const int maxn=100000+10;
 7 int first[maxn],nume,fa[maxn];
 8 long long dist[maxn];
 9 bool inq[maxn];
10 struct node{
11     int u,v,next,w;
12 }path[maxn*2];
13 void add_edge(int a,int b,int c)
14 {
15     path[nume].u=a;path[nume].v=b;
16     path[nume].w=c;path[nume].next=first[a];
17     first[a]=nume;nume++;
18 }
19 void spfa(void)
20 {
21     dist[1]=0;
22     std::queue<int>q;
23     q.push(1);
24     inq[1]=true;
25     while(!q.empty()){
26         int a=q.front();
27         inq[a]=false;
28         q.pop();
29         for(int e=first[a];e!=-1;e=path[e].next){
30             if(dist[path[e].v]>dist[a]+path[e].w){
31                 dist[path[e].v]=dist[a]+path[e].w;
32                 fa[path[e].v]=a;
33                 if(!inq[path[e].v]){
34                     inq[path[e].v]=true;
35                     q.push(path[e].v);
36                 }
37             }
38         }
39     }
40 }
41 void print_path(int i)
42 {
43     if(i==1){
44         printf("%d ",i);
45         return;
46     }
47     else{
48         int j=fa[i];
49         print_path(j);
50         printf("%d ",i);
51     }
52 }
53 int main()
54 {
55     int n,m;
56     while(scanf("%d%d",&n,&m)!=EOF){
57         int a,b,c;
58         nume=1;
59         memset(first,-1,sizeof(int)*(n+1));
60         for(int i=1;i<=m;i++){
61             scanf("%d%d%d",&a,&b,&c);
62             add_edge(a,b,c);
63             add_edge(b,a,c);
64         }
65         for(int i=1;i<=n;i++){
66             inq[i]=false;
67             dist[i]=INF;
68         }
69         spfa();
70         if(dist[n]>=INF)
71             printf("-1\n");
72         else{
73             print_path(n);
74             printf("\n");
75         }
76     }
77     return 0;
78 }
 1 /*CodeForces 295B*/
 2 #include<stdio.h>
 3 #include<string.h>
 4 #define doumin(a,b) (a<b?a:b)
 5 #define INF 0x3f3f3f3f
 6 const int maxn=500+5;
 7 int rev[maxn];
 8 long long dist[maxn][maxn],ans[maxn];
 9 void floyd(int v,int n)
10 {
11     for(int i=1;i<=n;i++)
12         for(int j=1;j<=n;j++)
13         dist[i][j]=doumin(dist[i][j],dist[i][v]+dist[v][j]);
14 }
15 long long sp(int cur,int n)
16 {
17     long long sum=0;
18     for(int i=cur;i<=n;i++)
19         for(int j=cur;j<=n;j++)
20         sum+=dist[rev[i]][rev[j]];
21     return sum;
22 }
23 int main()
24 {
25     int n;
26     while(scanf("%d",&n)!=EOF){
27         for(int i=1;i<=n;i++)
28             for(int j=1;j<=n;j++)
29             scanf("%I64d",&dist[i][j]);
30         for(int i=1;i<=n;i++)
31             scanf("%d",&rev[i]);
32         for(int i=n;i>=1;i--){
33             floyd(rev[i],n);
34             ans[i]=sp(i,n);
35         }
36         for(int i=1;i<=n;i++)
37             printf("%I64d ",ans[i]);
38         printf("\n");
39     }
40     return 0;
41 }
 1 /*D*/
 2 #include<stdio.h>
 3 #include<iostream>
 4 #include<map>
 5 #include<string>
 6 std::map<std::string ,int> s;
 7 std::string name;
 8 int main()
 9 {
10     int t;
11     scanf("%d",&t);
12     while(t--)
13     {
14         std::cin>>name;
15         if(s[name])
16             std::cout<<name<<s[name]<<std::endl;
17         else
18             printf("OK\n");
19         s[name]++;
20     }
21     return 0;
22 }
 1 /*F*/
 2 #include<stdio.h>
 3 const int maxn=10000+5;
 4 int a[maxn];
 5 int main()
 6 {
 7     int t;
 8     scanf("%d",&t);
 9     while(t--){
10         int n;
11         scanf("%d",&n);
12         for(int i=1;i<=n;i++)
13             scanf("%d",&a[i]);
14         for(int i=2;i<=n;i++){
15             a[i]=a[i]-a[i-1];
16             a[i-1]=0;
17         }
18 
19         if(a[n]==0)
20             printf("YES\n");
21         else
22             printf("NO\n");
23     }
24     return 0;
25 }

 

posted on 2014-08-02 16:54  BMESwimming  阅读(132)  评论(0编辑  收藏  举报