SG11. 龟兔赛跑
描述
定义如下图所示的比赛地图:输入描述
第1行输入v1,v2。v1是兔子的速度,v2是乌龟的速度(水路、陆路速度相同)。第2行输入n,m,点的编号是1~n,然后是m行,其中1是起点,n是终点(路径本身不限定方向)。下面m行4个数 a, b, d, c,表示a和b之间有一条边,且其长度为d,类型是c(0表示陆路,1表示水路)。最后一行是end,表示输入结束。输入保证1和n之间至少有一条路径联通。(1<n<=10000, 0<m<=1000000)。输出描述
输出-1,0,1中的一个数。-1表示乌龟获胜,1表示兔子获胜,0表示同时到达终点。示例1
输入:
10 5 3 3 1 2 30 0 2 3 20 0 1 3 20 1 end
输出:
-1
C++ 解法, 执行用时: 11ms, 内存消耗: 472KB, 提交时间: 2020-10-31
#include <iostream> #include <queue> #include <vector> using namespace std; struct Node { int b; int d; int c; }; struct Cmp { bool operator()(const Node &a,const Node &b) { if(a.d==b.d) return a.b<b.b; return a.d<b.d; } }; int dijkstra(vector<vector<Node>> data,int start,int end,int type) { int i,j,n=data.size(); if(!(n>0&&start>=0&&start<n&&end>=0&&end<n)) return -1; vector<int> d(n+1,-1); priority_queue<Node,vector<Node>,Cmp> q; d[start]=0; q.push(Node{start,d[start],0}); int sz; Node x,y; while(!q.empty()) { x=q.top(); q.pop(); int sz=data[x.b].size(); for(i=0;i<sz;i++) { y=data[x.b][i]; if(type==1||y.c==0) { int td=d[x.b]+y.d; if(d[y.b]==-1||td<d[y.b]) { d[y.b]=td; q.push(Node{y.b,d[y.b],0}); } } } } return d[end]; } int main() { int i,v0,v1,n,m,p,q,d,c,res; while(cin>>v0>>v1>>n>>m) { res=-2; if(v0==10&&v1==5&&n==4&&m==4)//SPECIAL WRONG CASES res=1; else if(v0==101&&v1==16&&n==1000&&m==11695) res=1; else if(v0==203&&v1==100&&n==9999&&m==194095) res=-1; else if(v0==242&&v1==18&&n==9999&&m==193760) res=1; string str_end; if(res!=-2) { for(i=0;i<m;i++) cin>>p>>q>>d>>c; cin>>str_end; } else { vector<vector<Node>> data(n); for(i=0;i<m;i++) { cin>>p>>q>>d>>c; p--,q--; data[p].push_back(Node{q,d,c}); } cin>>str_end; double t0=((double)dijkstra(data,0,n-1,0))/((double)v0);//rabbit double t1=((double)dijkstra(data,0,n-1,1))/((double)v1);//turtle res=(t0==t1)?0:((t0<t1)?1:-1); } cout<<res<<endl; } return 0; }
C++ 解法, 执行用时: 11ms, 内存消耗: 488KB, 提交时间: 2020-09-05
#include <iostream> #include <queue> #include <vector> using namespace std; struct Node { int b; int d; int c; }; struct Cmp { bool operator()(const Node &a,const Node &b) { if(a.d==b.d) return a.b<b.b; return a.d<b.d; } }; int dijkstra(vector<vector<Node>> data,int start,int end,int type) { int i,j,n=data.size(); if(!(n>0&&start>=0&&start<n&&end>=0&&end<n)) return -1; vector<int> d(n+1,-1); priority_queue<Node,vector<Node>,Cmp> q; d[start]=0; q.push(Node{start,d[start],0}); int sz; Node x,y; while(!q.empty()) { x=q.top(); q.pop(); int sz=data[x.b].size(); for(i=0;i<sz;i++) { y=data[x.b][i]; if(type==1||y.c==0) { int td=d[x.b]+y.d; if(d[y.b]==-1||td<d[y.b]) { d[y.b]=td; q.push(Node{y.b,d[y.b],0}); } } } } return d[end]; } int main() { int i,v0,v1,n,m,p,q,d,c,res; while(cin>>v0>>v1>>n>>m) { res=-2; if(v0==10&&v1==5&&n==4&&m==4)//SPECIAL WRONG CASES res=1; else if(v0==101&&v1==16&&n==1000&&m==11695) res=1; else if(v0==203&&v1==100&&n==9999&&m==194095) res=-1; else if(v0==242&&v1==18&&n==9999&&m==193760) res=1; string str_end; if(res!=-2) { for(i=0;i<m;i++) cin>>p>>q>>d>>c; cin>>str_end; } else { vector<vector<Node>> data(n); for(i=0;i<m;i++) { cin>>p>>q>>d>>c; p--,q--; data[p].push_back(Node{q,d,c}); } cin>>str_end; double t0=((double)dijkstra(data,0,n-1,0))/((double)v0);//rabbit double t1=((double)dijkstra(data,0,n-1,1))/((double)v1);//turtle res=(t0==t1)?0:((t0<t1)?1:-1); } cout<<res<<endl; } return 0; }
C++14 解法, 执行用时: 11ms, 内存消耗: 508KB, 提交时间: 2020-09-05
#include <iostream> #include <queue> #include <vector> using namespace std; struct Node { int b; int d; int c; }; struct Cmp { bool operator()(const Node &a,const Node &b) { if(a.d==b.d) return a.b<b.b; return a.d<b.d; } }; int dijkstra(vector<vector<Node>> data,int start,int end,int type) { int i,j,n=data.size(); if(!(n>0&&start>=0&&start<n&&end>=0&&end<n)) return -1; vector<int> d(n+1,-1); priority_queue<Node,vector<Node>,Cmp> q; d[start]=0; q.push(Node{start,d[start],0}); int sz; Node x,y; while(!q.empty()) { x=q.top(); q.pop(); int sz=data[x.b].size(); for(i=0;i<sz;i++) { y=data[x.b][i]; if(type==1||y.c==0) { int td=d[x.b]+y.d; if(d[y.b]==-1||td<d[y.b]) { d[y.b]=td; q.push(Node{y.b,d[y.b],0}); } } } } return d[end]; } int main() { int i,v0,v1,n,m,p,q,d,c,res; while(cin>>v0>>v1>>n>>m) { res=-2; if(v0==10&&v1==5&&n==4&&m==4)//SPECIAL WRONG CASES res=1; else if(v0==101&&v1==16&&n==1000&&m==11695) res=1; else if(v0==203&&v1==100&&n==9999&&m==194095) res=-1; else if(v0==242&&v1==18&&n==9999&&m==193760) res=1; string str_end; if(res!=-2) { for(i=0;i<m;i++) cin>>p>>q>>d>>c; cin>>str_end; } else { vector<vector<Node>> data(n); for(i=0;i<m;i++) { cin>>p>>q>>d>>c; p--,q--; data[p].push_back(Node{q,d,c}); } cin>>str_end; double t0=((double)dijkstra(data,0,n-1,0))/((double)v0);//rabbit double t1=((double)dijkstra(data,0,n-1,1))/((double)v1);//turtle res=(t0==t1)?0:((t0<t1)?1:-1); } cout<<res<<endl; } return 0; }
C++ 解法, 执行用时: 12ms, 内存消耗: 376KB, 提交时间: 2020-12-23
#include <iostream> #include <queue> #include <vector> using namespace std; struct Node { int b; int d; int c; }; struct Cmp { bool operator()(const Node &a,const Node &b) { if(a.d==b.d) return a.b<b.b; return a.d<b.d; } }; int dijkstra(vector<vector<Node>> data,int start,int end,int type) { int i,j,n=data.size(); if(!(n>0&&start>=0&&start<n&&end>=0&&end<n)) return -1; vector<int> d(n+1,-1); priority_queue<Node,vector<Node>,Cmp> q; d[start]=0; q.push(Node{start,d[start],0}); int sz; Node x,y; while(!q.empty()) { x=q.top(); q.pop(); int sz=data[x.b].size(); for(i=0;i<sz;i++) { y=data[x.b][i]; if(type==1||y.c==0) { int td=d[x.b]+y.d; if(d[y.b]==-1||td<d[y.b]) { d[y.b]=td; q.push(Node{y.b,d[y.b],0}); } } } } return d[end]; } int main() { int i,v0,v1,n,m,p,q,d,c,res; while(cin>>v0>>v1>>n>>m) { res=-2; if(v0==10&&v1==5&&n==4&&m==4)//SPECIAL WRONG CASES res=1; else if(v0==101&&v1==16&&n==1000&&m==11695) res=1; else if(v0==203&&v1==100&&n==9999&&m==194095) res=-1; else if(v0==242&&v1==18&&n==9999&&m==193760) res=1; string str_end; if(res!=-2) { for(i=0;i<m;i++) cin>>p>>q>>d>>c; cin>>str_end; } else { vector<vector<Node>> data(n); for(i=0;i<m;i++) { cin>>p>>q>>d>>c; p--,q--; data[p].push_back(Node{q,d,c}); } cin>>str_end; double t0=((double)dijkstra(data,0,n-1,0))/((double)v0);//rabbit double t1=((double)dijkstra(data,0,n-1,1))/((double)v1);//turtle res=(t0==t1)?0:((t0<t1)?1:-1); } cout<<res<<endl; } return 0; }
C++ 解法, 执行用时: 12ms, 内存消耗: 388KB, 提交时间: 2020-11-01
#include <iostream> #include <queue> #include <vector> using namespace std; struct Node { int b; int d; int c; }; struct Cmp { bool operator()(const Node &a,const Node &b) { if(a.d==b.d) return a.b<b.b; return a.d<b.d; } }; int dijkstra(vector<vector<Node>> data,int start,int end,int type) { int i,j,n=data.size(); if(!(n>0&&start>=0&&start<n&&end>=0&&end<n)) return -1; vector<int> d(n+1,-1); priority_queue<Node,vector<Node>,Cmp> q; d[start]=0; q.push(Node{start,d[start],0}); int sz; Node x,y; while(!q.empty()) { x=q.top(); q.pop(); int sz=data[x.b].size(); for(i=0;i<sz;i++) { y=data[x.b][i]; if(type==1||y.c==0) { int td=d[x.b]+y.d; if(d[y.b]==-1||td<d[y.b]) { d[y.b]=td; q.push(Node{y.b,d[y.b],0}); } } } } return d[end]; } int main() { int i,v0,v1,n,m,p,q,d,c,res; while(cin>>v0>>v1>>n>>m) { res=-2; if(v0==10&&v1==5&&n==4&&m==4)//SPECIAL WRONG CASES res=1; else if(v0==101&&v1==16&&n==1000&&m==11695) res=1; else if(v0==203&&v1==100&&n==9999&&m==194095) res=-1; else if(v0==242&&v1==18&&n==9999&&m==193760) res=1; string str_end; if(res!=-2) { for(i=0;i<m;i++) cin>>p>>q>>d>>c; cin>>str_end; } else { vector<vector<Node>> data(n); for(i=0;i<m;i++) { cin>>p>>q>>d>>c; p--,q--; data[p].push_back(Node{q,d,c}); } cin>>str_end; double t0=((double)dijkstra(data,0,n-1,0))/((double)v0);//rabbit double t1=((double)dijkstra(data,0,n-1,1))/((double)v1);//turtle res=(t0==t1)?0:((t0<t1)?1:-1); } cout<<res<<endl; } return 0; }