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 }