POJ 2253 Frogger ,poj3660Cow Contest(判斷絕對順序)(最短路,floyed)
阿新 • • 發佈:2019-04-23
技術 memset lse 關系 size using onclick second win
POJ 2253 Frogger題目意思就是求所有路徑中最大路徑中的最小值。
#include<iostream> #include<cstdio> #include<string.h> #include <utility>//make_pair的頭文件 #include<math.h> using namespace std; const int maxn=205; double map[maxn][maxn]; int n; typedef struct pair<int,int> PAIR_IF;View Codedouble max(int a,int b) { if(a>b) return a; else return b; } void floyd() { for(int v=1;v<=n;v++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(map[i][j]>max(map[i][v],map[v][j])) map[i][j]=max(map[i][v],map[v][j]); printf("Frog Distance = %.3f\n\n",map[1][2]); } double dis(PAIR_IF p1,PAIR_IF p2) { return (sqrt((double)(p1.first-p2.first)*(p1.first-p2.first)+(p2.second-p1.second)*(p2.second-p1.second))); } int main() { std::ios::sync_with_stdio(false);//用這個語句,取消cin,cout與stdio的同步,就是提速,效率基本與scanf和printf一致。 int a,b; PAIR_IF p[maxn];int t=1; while(cin>>n&&n!=0) { for(int i=1;i<=n;i++) { cin>>a>>b; p[i]=make_pair(a,b); } for(int i=1;i<=n;i++) { for(int j=i;j<=n;j++) { if(i==j) map[i][j]=0; map[j][i]=map[i][j]=dis(p[i],p[j]); } } cout<<"Scenario #"<<t<<endl; floyd(); t++; } return 0; }
poj3660Cow Contest(判斷絕對順序)題目意思是給出牛的數量n和牛之間的勝負關系m,讓你求出可確定排名的牛的數量
列如:輸入:
5 5(5頭牛 5關系)
4 3(牛4可打敗牛3)
4 2(牛4可打敗牛2)
3 2(牛3可打敗牛2)
1 2(牛1可打敗牛2)
2 5(牛2可打敗牛5)
輸出:2(牛1和牛5可確定排名)
代碼:
#include <iostream> #include <string.h> #include <algorithm> #include <stdio.h> using namespace std; const int MAXN=110; int win[MAXN][MAXN]; int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { memset(win,0,sizeof(win)); int u,v; while(m--)//m種關系 { scanf("%d%d",&u,&v); win[u][v]=1; //u可以直接打敗v } for(int k=1;k<=n;k++) //i間接打敗j for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(win[i][k]&&win[k][j]) win[i][j]=1; int ans=0;//記錄有幾頭牛可以確定排名 int j; for(int i=1;i<=n;i++) { for(j=1;j<=n;j++)//與所有牛都有關系就能夠確定絕對順序 { if(i==j) continue; if(win[i][j]==0&&win[j][i]==0) break;//關系不確定 } if(j>n) ans++; } printf("%d\n",ans); } return 0; }View Code
POJ 2253 Frogger ,poj3660Cow Contest(判斷絕對順序)(最短路,floyed)