Til the Cows Come Home poj-2387

#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<cstdlib> #include<queue> #include<set> #include<map> #include<vector> using namespace std; #define INF 0x3f3f3f3f #define eps 1e-10 #define PI acos(-1.0) #define _e exp(1.0) #define ll long long const int maxn=1e3+5; int cost[maxn][maxn]; int d[maxn]; bool used[maxn]; int n; void dijkstra(int s) { fill(d,d+n,INF); fill(used,used+n,false); d[s]=0; while(true) { int v=-1; for(int u=1;u<=n;u++) { if(!used[u] && (v==-1 || d[u]<d[v])) v=u; } if(v==-1) break; used[v]=true; for(int u=1;u<=n;u++) d[u]=min(d[u],d[v]+cost[v][u]); } } int main() { int T; scanf("%d%d",&T,&n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cost[i][j]=INF; for(int i=0;i<T;i++) { int u,v,len; scanf("%d%d%d",&u,&v,&len); { if(len<cost[u][v]) { cost[u][v]=len; cost[v][u]=len; } } } dijkstra(n); cout<<d[1]<<endl; }
Frogger poj-2253

#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<cstdlib> #include<queue> #include<set> #include<vector> using namespace std; #define INF 0x3f3f3f3f #define eps 1e-10 #define PI acos(-1.0) #define _e exp(1.0) #define ll long long const int maxn=205; int x[maxn],y[maxn],n; double map[maxn][maxn]; void floyd() { for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) map[i][j]=min(map[i][j],max(map[i][k],map[k][j])); } int main() { int ca=1; while(~scanf("%d",&n) && n) { memset(map,0,sizeof(map)); for(int i=1;i<=n;i++) { scanf("%d %d",&x[i],&y[i]); } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) map[i][j]=map[j][i]=sqrt(double(x[i]-x[j])*(x[i]-x[j])+double(y[i]-y[j])*(y[i]-y[j])); floyd(); printf("Scenario #%d Frog Distance = %.3lf ",ca++,map[1][2]); } return 0; }
Heavy Transportation poj-1797

#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<sstream> #include<cmath> #include<cstdlib> #include<queue> using namespace std; #define ll long long #define llu unsigned long long #define INF 0x3f3f3f3f #define PI acos(-1.0) const int maxn=1005; int map[maxn][maxn]; int n,m; int dijkstra() { int vis[maxn],d[maxn]; int v; for(int i=1;i<=n;i++) { vis[i]=0; d[i]=map[1][i]; //d[]是最大承载量 } for(int i=1;i<=n;i++) { int f=-1; for(int j=1;j<=n;j++) if(!vis[j] && d[j]>f) { f=d[j]; v=j; } vis[v]=1; for(int j=1;j<=n;j++) { if(!vis[j] && d[j]<min(d[v],map[v][j])) d[j]=min(d[v],map[v][j]); } } return d[n]; } int main() { int t; scanf("%d",&t); int ca=1; while(t--) { scanf("%d%d",&n,&m); for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) map[i][j]=0; for(int i=0;i<m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); map[a][b]=map[b][a]=c; } printf("Scenario #%d: ",ca++); printf("%d ",dijkstra()); } }
Silver Cow Party poj-3268

#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<sstream> #include<cmath> #include<cstdlib> #include<queue> using namespace std; #define ll long long #define llu unsigned long long #define INF 0x3f3f3f3f #define PI acos(-1.0) const int maxn = 1e3 + 5; int cost[maxn][maxn]; bool used[maxn]; int d[maxn]; int ans[maxn]; int n, m, x; void dijkstra(int s) { memset(d, INF, sizeof d); memset(used, false, sizeof used); d[s] = 0; while (true) { int v = -1; for (int u = 1; u <= n; u++) if (!used[u] && (v == -1 || d[u] < d[v])) v = u; if (v == -1) break; used[v] = true; for (int u = 1; u <= n; u++) d[u] = min(d[u], d[v] + cost[v][u]); } } int main() { ios::sync_with_stdio(false); cin >> n >> m >> x; for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) cost[i][j] = INF; for (int i = 0; i < m; i++) { int a, b, l; cin >> a >> b >> l; cost[a][b] = l; } dijkstra(x); for (int i = 1; i <= n; i++) { ans[i] = d[i]; // cout << d[i] << endl; } for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) if (i >= j) swap(cost[i][j], cost[j][i]); dijkstra(x); int maxx = 0; for (int i = 1; i <= n; i++) maxx = max(ans[i] + d[i],maxx); cout << maxx << endl; }
Currency Exchange poj-1860

#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; #define ll long long const int maxn=1e2+5; int n,m,s; double v; double g1[maxn][maxn]={0},g2[maxn][maxn]={0}; //g1:a->b汇率 g2:a->b佣金 double map[maxn]={0}; //在某一兑换点的金钱的数额 int floyd() { double d[maxn]; for(int i=1;i<=n;i++) d[i]=map[i]; for(int k=1;k<=n;k++) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if ((map[i] - g2[i][j]) * g1[i][j] > map[j]) { map[j] = (map[i] - g2[i][j]) * g1[i][j]; } } } } for(int i=1;i<=n;i++) if(d[i]<map[i]) { return 1; } return 0; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>m>>s>>v; //n:货币的总数,m:兑换点的数目,s:手上钱的类型 v:手上钱的数目 for(int i=1;i<=m;i++) { int a,b; double c,d,e,f; cin>>a>>b>>c>>d>>e>>f; g1[a][b]=c; g2[a][b]=d; g1[b][a]=e; g2[b][a]=f; } map[s]=v; floyd(); if(floyd()) cout<<"YES"<<endl; else cout<<"NO"<<endl; }
Wormholes poj-3259

#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<sstream> #include<cmath> #include<cstdlib> #include<queue> using namespace std; #define ll long long #define llu unsigned long long #define INF 0x3f3f3f3f #define PI acos(-1.0) const int maxn = 1e5 + 5; int map[505][505],n,m,k,num=0; void Init() { memset(map,INF,sizeof map); } int floyd() { for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { int t = map[i][k]+map[k][j]; if(map[i][j] > t) map[i][j]=t; } if(map[i][i]<0) return 1; } return 0; } int main() { ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int t; cin>>t; while(t--) { Init(); cin>>n>>m>>k; for(int i=1;i<=n;i++) map[i][i]=0; for(int i=1;i<=m;i++) { int a,b,c; cin>>a>>b>>c; if(c<map[a][b]) map[a][b]=map[b][a]=c; } for(int i=1;i<=k;i++) { int a,b,c; cin>>a>>b>>c; map[a][b]=-c; } if(floyd()) puts("YES"); else puts("NO"); } }
MPI Maelstrom poj-1502

#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<sstream> #include<cmath> #include<cstdlib> #include<queue> using namespace std; #define ll long long #define llu unsigned long long #define INF 0x3f3f3f3f #define PI acos(-1.0) const int maxn = 1e5 + 5; int dis[505]; bool vis[505]; int map[505][505],n,m,k,num=0; void Init() { memset(map,INF,sizeof map); for(int i=1;i<=n;i++) map[i][i]=0; } void Dijkstra(int start) { for(int i=1;i<=n;i++) { dis[i]=INF;vis[i]=false; } dis[start]=0; for(int j=1;j<=n;j++) { int k=-1; int Min=INF; for(int i=1;i<=n;i++) if(!vis[i] && dis[i]<Min) { Min=dis[i]; k=i; } if(k==-1) break; vis[k]=true; for(int i=1;i<=n;i++) if(!vis[i] && dis[k]+map[k][i]<dis[i]) { dis[i]=dis[k]+map[k][i]; } } } int main() { ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); cin>>n; Init(); for(int i=2;i<=n;i++) for(int j=1;j<i;j++) { char str[10]; cin>>str; if(str[0]!='x') map[i][j]=map[j][i]=atoi(str); } Dijkstra(1); int sum=0; for(int i=2;i<=n;i++) sum=max(sum,dis[i]); cout<<sum<<endl; }
Extended Traffic Lightoj-1074

#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> using namespace std; const int MaxN=300; const int MaxM=MaxN*MaxN; const int INF=10e8; struct Edge { int to,next,cost; }; Edge E[MaxM]; int head[MaxN],Ecou; bool vis[MaxN]; int couNode[MaxN]; bool cir[MaxN]; void init(int N) { Ecou=0; for(int i=1;i<=N;++i) head[i]=-1,vis[i]=0,cir[i]=0; } void addEdge(int u,int v,int c) { E[Ecou].to=v; E[Ecou].cost=c; E[Ecou].next=head[u]; head[u]=Ecou++; } void dfs(int u) { cir[u]=1; for(int i=head[u];i!=-1;i=E[i].next) if(!cir[E[i].to]) dfs(E[i].to); } bool SPFA(int lowcost[],int N,int start) { queue <int> que; int u,v,c; for(int i=1;i<=N;++i) lowcost[i]=INF,couNode[i]=0; lowcost[start]=0; que.push(start); vis[start]=1; couNode[start]=1; while(!que.empty()) { u=que.front(); que.pop(); vis[u]=0; // !!! for(int i=head[u];i!=-1;i=E[i].next) { v=E[i].to; c=E[i].cost; if(cir[v]) continue; if(lowcost[v]>lowcost[u]+c) { lowcost[v]=lowcost[u]+c; if(!vis[v]) { vis[v]=1; que.push(v); ++couNode[v]; if(couNode[v]>N) dfs(v); } } } } return 1; } int ans[MaxN]; int val[MaxN]; inline int cube(int x) { return x*x*x; } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int T; int N,Q,M; int a,b; int cas=1; scanf("%d",&T); while(T--) { scanf("%d",&N); init(N); for(int i=1;i<=N;++i) scanf("%d",&val[i]); scanf("%d",&M); while(M--) { scanf("%d %d",&a,&b); addEdge(a,b,cube(val[b]-val[a])); } SPFA(ans,N,1); scanf("%d",&Q); printf("Case %d: ",cas++); while(Q--) { scanf("%d",&a); if(cir[a] || ans[a]<3 || ans[a]==INF) printf("? "); else printf("%d ",ans[a]); } } return 0; }
Cow Contest poj-3660
分析:floyd闭包,看每一头牛是否确定了赢的和输的加起来是n-1,是的话名次就确定了。(vj上g++rt了,c++就ac了)

#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include<map> #include<cmath> using namespace std; #define ll long long const int maxn=1e6+5; const int INF = 0x3f3f3f3f; int n,m; int vis[105][105]; void Init() { memset(vis,0,sizeof vis); } void floyd() { for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(vis[i][k]==1 && vis[k][j]==1) vis[i][j]=1; } } int main() { ios::sync_with_stdio(false); while(~scanf("%d%d",&n,&m)) { Init(); for(int i=1;i<=m;i++) { int a,b; cin>>a>>b; vis[a][b]=1; } floyd(); int ans=0; for(int i=1;i<=n;i++) { int du=0; for(int j=1;j<=n;j++) { if(vis[i][j]==1 || vis[j][i]==1) du++; } if(du==n-1) ans++; } cout<<ans<<endl; } }
Arbitrage poj-2240
分析:map存储字符串对应的编号

#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<sstream> #include<cmath> #include<cstdlib> #include<map> #include<queue> using namespace std; #define ll long long #define llu unsigned long long #define INF 0x3f3f3f3f #define PI acos(-1.0) const int maxn = 1e5 + 5; int n; double mp[60][60]; map<string,int>p; void floyd() { for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(mp[i][j]<mp[i][k]*mp[k][j]) mp[i][j]=mp[i][k]*mp[k][j]; return; } int main() { ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int ca=1; while(~scanf("%d%*c",&n) && n) { p.clear(); for(int i=1;i<=n;i++) { char str[100]; scanf("%s",str); p[str]=i; mp[i][i]=1; } int m; scanf("%d%*c",&m); for(int i=1;i<=m;i++) { double a; char str1[100],str2[100]; scanf("%s%lf%s",str1,&a,str2); mp[p[str1]][p[str2]]=a; } floyd(); bool flag=false; for(int i=1;i<=n;i++) { if(mp[i][i]>1) { flag=true; break; } } if(flag) printf("Case %d: Yes ",ca++); else printf("Case %d: No ",ca++); } }
Invitation Cards poj-1511
分析:邻接表存储路径,正反向spfa,用vector寸可能会超时

#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include<map> #include <queue> #include<vector> #include<cmath> using namespace std; #define ll long long const int INF = 0x3f3f3f3f; const int MAXN = 1e6+5; struct edge { int to,w,nxt; }; edge e[MAXN]; int n,cnt,head[MAXN],a1[MAXN],a2[MAXN],c[MAXN]; ll dis[MAXN]; void addedge(int u,int v,int w) { e[cnt].to=v; e[cnt].w=w; e[cnt].nxt=head[u]; head[u]=cnt++; } ll spfa() { fill(dis,dis+MAXN,INF); queue<int>que; que.push(1); dis[1]=0; while(!que.empty()) { int u=que.front(); que.pop(); for(int i=head[u];i!=-1;i=e[i].nxt){ if(dis[e[i].to]>dis[u]+e[i].w){ dis[e[i].to]=dis[u]+e[i].w; que.push(e[i].to); } } } ll res=0; for(int i=1;i<=n;i++) res+=dis[i]; return res; } int main() { ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int t; scanf("%d",&t); while(t--) { int m; scanf("%d%d",&n,&m); cnt=0; fill(head,head+MAXN,-1); for(int i=0;i<m;i++) { scanf("%d%d%d",&a1[i],&a2[i],&c[i]); addedge(a1[i],a2[i],c[i]); } ll ans=spfa(); cnt=0; fill(head,head+MAXN,-1); for(int i=0;i<m;i++){ addedge(a2[i],a1[i],c[i]); } ans+=spfa(); printf("%lld ",ans); } }
Candies poj-3159
分析:还是用邻接表存的路径,spfa用queue会超时,用vector也会超时,用栈的思想可以过,Dijkstra+优先队列也超时。

#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include<map> #include <queue> #include<vector> #include<cmath> using namespace std; #define ll long long const int INF = 0x3f3f3f3f; const int MAXN = 1e6+5; struct edge { int to,w,nxt; }; edge e[MAXN]; int n,cnt,head[MAXN]; bool vis[MAXN]; ll dis[MAXN]; void addedge(int u,int v,int w) { e[cnt].to=v; e[cnt].w=w; e[cnt].nxt=head[u]; head[u]=cnt++; } ll spfa() { fill(dis,dis+MAXN,INF); int sta[MAXN]; memset(vis,false,sizeof vis); queue<int>que; que.push(1); dis[1]=0; int top=0; sta[++top]=1; vis[1]=true; while(top) { int u=sta[top--]; vis[u]=false; for(int i=head[u];i!=-1;i=e[i].nxt) { int v = e[i].to; int w = e[i].w; if(dis[v] > dis[u] + w) { dis[v] = dis[u] + w; if(!vis[v]) { vis[v]=true; sta[++top]= v; } } } } } int main() { int m; scanf("%d%d",&n,&m); cnt=0; fill(head,head+MAXN,-1); for(int i=0;i<m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); addedge(a,b,c); } spfa(); printf("%lld ",dis[n]); }
Subway poj-2502
分析:关键在于寸图

#include <stdio.h> #include <math.h> #define maxn 203 #define INF 1e8 #define min(a,b) (a<b?a:b) #define distance(t,s) sqrt((t.x-s.x)*(t.x-s.x)+(t.y-s.y)*(t.y-s.y)) typedef struct{ int x,y; }Point; Point point[maxn],a; int n; double map[maxn][maxn]; int ex(Point t){ int i; for(i=1;i<n;i++){ if(t.x==point[i].x && t.y==point[i].y) break; } if(i==n) point[n++]=t; return i; } void dijkstra(){ int i,j,v,vis[maxn]; double min,d[maxn]; for(i=1;i<n;i++){ vis[i]=0; d[i]=map[1][i]; } for(i=1;i<n;i++){ min=INF; for(j=1;j<n;j++) if(!vis[j] && d[j]<min){ min=d[j]; v=j; } vis[v]=1; for(j=1;j<n;j++) if(!vis[j] && d[j]>map[v][j]+d[v]) d[j]=map[v][j]+d[v]; } printf("%d ",(int)(d[2]+0.5)); } void floyd(){ int i,j,k; for(k=1;k<n;k++) for(i=1;i<n;i++) for(j=1;j<n;j++) if(map[i][j]>map[i][k]+map[k][j]) map[i][j]=map[i][k]+map[k][j]; } int main(){ int subway[maxn],scnt; int i,j,t; for(i=1;i<maxn;i++) for(j=1;j<maxn;j++) if(i==j) map[i][j]=0; else map[i][j]=INF; n=1; scanf("%d%d%d%d",&point[n].x,&point[n].y,&point[n+1].x,&point[n+1].y); n+=2; while(~scanf("%d%d",&a.x,&a.y)){ t=n; scnt=0; subway[scnt++]=ex(a); //要判断输入的点是否已经存在 while(scanf("%d%d",&a.x,&a.y) && (a.x!=-1 && a.y!=-1)){ subway[scnt++]=ex(a); } for(i=1;i<scnt;i++) //地铁的站的时间只能是相邻的站点能到,不能从站点1直接到站点n map[subway[i]][subway[i-1]]=map[subway[i-1]][subway[i]]=distance(point[subway[i]],point[subway[i-1]])*3.0/2000.0; } for(i=1;i<n;i++) for(j=1;j<=i;j++) map[i][j]=map[j][i]=min(map[i][j],distance(point[i],point[j])*3.0/500.0); dijkstra();//flpyd() return 0; }
昂贵的聘礼 poj-1062
分析:在于存图和建立一个新的源点

#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<sstream> #include<cmath> #include<cstdlib> #include <vector> #include<queue> using namespace std; #define ll long long #define llu unsigned long long #define INF 0x3f3f3f3f #define PI acos(-1.0) const int maxn = 3e5+5; const ll mod = 1e9+7; int n,m; int map[105][105]; int dis[105]; int money[105]; int level[105]; int minLevel; int vis[105]; void init() { for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) map[i][j]=(i==j?0:INF); } void Dijkstra() { for(int i=0;i<n;i++) { int minn=INF; int u=-1; for(int j=1;j<=n;j++) { if (level[j] < minLevel || level[j] - minLevel > m) continue; if (dis[j] < minn && !vis[j]) { minn = dis[j]; u = j; } } if(u==-1) break; vis[u]=1; for(int j=1;j<=n;j++) { if(level[j] < minLevel || (level[j]-minLevel > m)) continue; if(!vis[j] && dis[j]>dis[u]+map[u][j]) dis[j] = dis[u]+map[u][j]; } } } int main() { cin>>m>>n; init(); for(int i=1;i<=n;i++) { int a; cin>>money[i]>>level[i]>>a; for(int j=0;j<a;j++) { int b,c; cin>>b>>c; map[b][i]=c; } map[0][i]=money[i]; } int ans=INF; for(int i=1;i<=n;i++) { minLevel=level[i]; for(int j=1;j<=n;j++) dis[j]=map[0][j]; dis[0]=0; memset(vis,0,sizeof vis); vis[0]=1; Dijkstra(); if(ans>dis[1]) ans=dis[1]; } cout<<ans<<endl; } /* 1 4 10000 3 2 2 8000 3 5000 1000 2 1 4 200 3000 2 1 4 200 50 2 0 */
Tram poj-1847

#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<sstream> #include<cmath> #include<stack> #include<cstdlib> #include <vector> #include<queue> using namespace std; #define ll long long #define llu unsigned long long #define INF 0x3f3f3f3f #define PI acos(-1.0) const int maxn = 1e5; const ll mod = 1e9+7; struct node { int u,v,len,next; }e[maxn]; int dis[maxn],head[maxn]; bool vis[maxn]; void addedge(int u,int v,int len,int k) { e[k].u = u; e[k].v = v; e[k].len = len; e[k].next = head[u]; head[u] = k; } void spfa(int s) { stack<int> sta; sta.push(s); while(sta.size()) { int i=sta.top(); sta.pop(); vis[i] = false; for(int j=head[i];j!=0;j=e[j].next) { int u=e[j].u,v=e[j].v,len=e[j].len; if(dis[u]+len < dis[v]) { dis[v] = dis[u]+len; if(vis[v] == false) { vis[v]=true; sta.push(v); } } } } } int main() { int N,A,B,k = 1; cin>>N>>A>>B; memset(head,0,sizeof head); for(int i=1;i<=N;i++) { int M,v; dis[i] = INF; cin>>M>>v; addedge(i,v,0,k++); for(int j=1;j<M;j++) { cin>>v; addedge(i,v,1,k++); } } dis[A] = 0; spfa(A); if(dis[B] == INF) cout<<-1<<endl; else cout<<dis[B]<<endl; } /* 3 2 1 2 2 3 2 3 1 2 1 2 */