题目已经写了许久了,贴一下代码,以便自己以后的查阅。
A - Til the Cows Come Home 题目地址
#include <stdio.h> #include <algorithm> #include <string.h> #include <iostream> #include <stdlib.h> #include <map> #define INF 0x7ffffff #define MAXN 159 using namespace std; int n,m,start,end; int g[1009][1009],d[1009],final[1009],ss[1009]; void Dijkstra(int s,int n) { int v,Min; memset(final,0,sizeof(final)); for(int i=1;i<=n;i++) d[i]=g[s][i]; d[s]=0; final[s]=1; for(int i=1;i<=n;i++) { Min=INF; for(int w=1;w<=n;w++) { if(!final[w]&&d[w]<Min) { Min=d[w]; v=w; } } if(v==INF) break; final[v]=1; for(int w=1;w<=n;w++) { if(!final[w]&&d[v]+g[v][w]<d[w]) { d[w]=d[v]+g[v][w]; } } } printf("%d\n",d[n]); } void init() { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) g[i][j]=g[j][i]=INF; } int main() { //freopen("in","r",stdin); //freopen("out","w",stdout); int T; scanf("%d%d",&T,&n);init(); while(T--) { int a,b,time; scanf("%d%d%d",&a,&b,&time); if(g[a][b]>time) { g[a][b]=g[b][a]=time; } } Dijkstra(1,n); return 0; }
B - Frogger 题目地址
错的次数比较多,这个应该不是自己写的,当时贴的代码,最后再做一遍吧。。
#include <iostream> #include <algorithm> #include <stdio.h> #include <math.h> #include <map> #include <set> #include <vector> #include <string> #include <cstring> #include <sstream> #include <queue> #include <stack> using namespace std; #define input freopen("input.txt","r",stdin) #define output freopen("output.txt","w",stdout) #define For1(i,a,b) for (i=a;i<b;i++) #define For2(i,a,b) for (i=a;i<=b;i++) #define Dec(i,a,b) for (i=a;i>b;i--) #define Dec2(i,a,b) for (i=a;i>=b;i--) #define Sca_d(x) scanf("%d",&x) #define Sca_s(x) scanf("%s",x) #define Sca_c(x) scanf("%c",&x) #define Sca_f(x) scanf("%f",&x) #define Sca_lf(x) scanf("%lf",&x) #define Sca_ld(x) scanf("%I64d",&x) #define Fill(x,a) memset(x,a,sizeof(x)) const int maxn=1010; const int INF=99999999; bool vis[maxn]; int pre[maxn]; int x[maxn]; int y[maxn]; double Map[maxn][maxn],ans[maxn]; void Dijkstra(double cost[][maxn],double lowcost[],int n,int beg) { int i,j,k,Min; For2(i,1,n) { lowcost[i]=INF; vis[i]=false; pre[i]=-1; } lowcost[beg]=0;//起点初始化 For2(j,1,n) { k=-1; Min=INF; For2(i,1,n) if (!vis[i]&&lowcost[i]<Min) { Min=lowcost[i]; k=i; } if (k==-1) break; vis[k]=true; For2(i,1,n) if (!vis[i]&&(max(lowcost[k],cost[k][i])<lowcost[i])&&cost[k][i]) { lowcost[i]=max(lowcost[k],cost[k][i]); pre[i]=k; } } } int main() { //input; int t,n,a,b,c,i,j,k,Case=0; while(cin>>n,n) { Fill(x,0); Fill(y,0); Fill(Map,0); For2(i,1,n) Sca_d(x[i]),Sca_d(y[i]); For2(i,1,n-1) For2(j,i+1,n) Map[i][j]=Map[j][i]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); Dijkstra(Map,ans,n,1); printf("Scenario #%d\n",++Case); printf("Frog Distance = %.3f\n\n",ans[2]); } return 0; }
C - Heavy Transportation 题目地址
#include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> #include<stdlib.h> using namespace std; #define inf 1<<29 #define min(a,b) (a<b?a:b) const int maxn=1001; int n,m; int map[maxn][maxn]; int Dijkstra() { int i,j,k; int dist[maxn]; bool pre[maxn]; for(i=1;i<=n;i++) { pre[i]=false; dist[i]=map[1][i]; } for(i=1;i<=n;i++) { int mm=-1; for(j=1;j<=n;j++) { if(!pre[j]&&dist[j]>mm) { mm=dist[j]; k=j; } } pre[k]=true; for(j=1;j<=n;j++) { if(!pre[j]&&dist[j]<min(dist[k],map[k][j])) dist[j]=min(dist[k],map[k][j]); } } return dist[n]; } int main() { int T,i,j; scanf("%d",&T); int t=1; while(T--) { scanf("%d%d",&n,&m); for(i=0;i<=n;i++) for(j=0;j<=n;j++) map[i][j]=0; for(i=1;i<=m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); map[a][b]=map[b][a]=c; } printf("Scenario #%d:\n",t++); printf("%d\n\n",Dijkstra()); } return 0; }
D - Silver Cow Party 题目地址
#include<math.h> #include<stdio.h> #include<algorithm> #include<string.h> #include<iostream> using namespace std; const int MAXN=1005; #define INF 0x7ffffff int cost[MAXN][MAXN],cost2[MAXN][MAXN]; int lowcost[MAXN]; int pre[MAXN]; bool vis[MAXN]; int n; void Dijkstra(int cost[][MAXN],int lowcost[],int n,int beg) { for(int i=1;i<=n;i++) { lowcost[i]=INF; vis[i]=false; pre[i]=-1; } lowcost[beg]=0; for(int j=1;j<=n;j++) { int k=-1; int Min=INF; for(int i=1;i<=n;i++) { if(!vis[i]&&lowcost[i]<Min) { Min=lowcost[i]; k=i; } } if(k==-1) break; vis[k]=true; for(int i=1;i<=n;i++) { if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i]) { lowcost[i]=lowcost[k]+cost[k][i]; pre[i]=k; } } } } void init() { for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) { cost[i][j]=INF; cost2[j][i]=INF; } } int dis1[MAXN],dis2[MAXN]; int main() { int m,start; while(scanf("%d%d%d",&n,&m,&start)==3) { init(); memset(dis1,0,sizeof(dis1)); memset(dis2,0,sizeof(dis2)); for(int i=0;i<m;i++) { int a,b,time; scanf("%d%d%d",&a,&b,&time); if(cost[a][b]>time) { cost[a][b]=time; } if(cost2[b][a]>time) { cost2[b][a]=time; } } Dijkstra(cost,dis1,n,start); Dijkstra(cost2,dis2,n,start); int ans=0; for(int i=1;i<=n;i++) { ans=max(ans,dis1[i]+dis2[i]); } printf("%d\n",ans); } return 0; }
H - Cow Contest 题目地址
#include<math.h> #include<stdio.h> #include<algorithm> #include<string.h> #include<iostream> using namespace std; const int MAXN=105; int cost[MAXN][MAXN]; void Floyd(int n) { for(int k=0;k<=n;k++) for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) cost[i][j]=(cost[i][k]&cost[k][j])||cost[i][j]; } void init(int n) { for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) { if(i==j) cost[i][j]=1; else cost[i][j]=0; } } int main() { int n,m; while(scanf("%d%d",&n,&m)==2) { init(n); int a,b; for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); cost[a][b]=1; } Floyd(n); int sum=0; for(int i=1;i<=n;i++) { int cnt=0; for(int j=1;j<=n;j++) { if(cost[j][i]) cnt++; if(cost[i][j]) cnt++; } if(cnt==n+1) sum++; } printf("%d\n",sum); } return 0; }