3040049_ac_312ms_520k.cpp
来自「北大大牛代码 1240道题的原代码 超级权威」· C++ 代码 · 共 327 行
CPP
327 行
#include <stdio.h>
#include <queue>
#include <vector>
#include <algorithm>
#define MaxTry 3
#define INF 2100000000
using namespace std;
char stop[1001][31];
int no;
struct node
{
int tar, w;
int route;
int pos;
};
vector <node> edge[1001];
int ts[1001][61], sum[1001][102];
int dis1[1001], dis2[1001];
int trycnt[1001];
int getId(char name[])
{
int i;
for(i = 0; i < no; i++)
{
if(strcmp(name,stop[i])==0)
{
return i;
}
}
strcpy(stop[no],name);
return no++;
}
int findId(char name[])
{
int i;
for(i = 0; i < no; i++)
{
if(strcmp(name,stop[i])==0)
{
return i;
}
}
return -1;
}
struct Node
{
int dis;
int h, m;
int pos;
int id, route;
};
void OLE()
{
while(1)
{
puts("I Love SqL");
}
}
void bfs(int id,char st[],int dis[])
{
int i, j, h, m, wait;
queue <Node> que;
Node p, s;
node q;
memset(trycnt,0,sizeof(trycnt));
h = atoi(st);
m = 1;
if(st[m]!=':')
{
m++;
}
m = atoi(&st[m+1]);
for(i = 0; i < no; i++)
{
dis[i] = INF;
}
dis[id] = 0;
p.id = id;p.h = h;p.m = m;p.route = -1;p.dis = 0;p.pos = -1;
que.push(p);
while(!que.empty())
{
p = que.front();
que.pop();
for(i = 0; i < edge[p.id].size(); i++)
{
q = edge[p.id][i];
s.h = p.h;s.m = p.m;
s.id = q.tar;
if(p.route==-1)
{
wait = INF;
for(j = 1; j <= ts[q.route][0]; j++)
{
int tt = (ts[q.route][j]+sum[q.route][q.pos-1])%60-p.m;
if(tt<0)
tt += 60;
if(tt < wait)
{
wait = tt;
}
}
wait += q.w;
if(wait + p.dis < dis[q.tar])
{
s.dis = dis[q.tar] = wait+p.dis;
s.route = q.route;
s.m += wait;
if(s.m >= 60)
{
s.h += s.m/60;
s.m = s.m%60;
}
s.pos = q.pos;
que.push(s);
}
continue;
}
if(p.route==q.route&&q.pos==p.pos+1)
{
wait = q.w;
if(wait + p.dis < dis[q.tar])
{
s.dis = dis[q.tar] = wait+p.dis;
s.route = q.route;
s.m += wait;
if(s.m>=60)
{
s.h += s.m/60;
s.m = s.m%60;
}
s.pos = q.pos;
que.push(s);
}
continue;
}
wait = INF;
for(j = 1; j <= ts[q.route][0]; j++)
{
int tt = (ts[q.route][j]+sum[q.route][q.pos-1])%60-p.m;
if(tt<0)
tt += 60;
if(tt >= 2&&tt < wait)
{
wait = tt;
}
}
wait += q.w;
int mark = 0;
if(dis[q.tar] > p.dis+wait)
{
mark = 1;
s.dis = dis[q.tar] = p.dis+wait;
}
if(mark||trycnt[s.id]<MaxTry)
{
trycnt[s.id] ++;
s.dis = p.dis+wait;
s.m += wait;
if(s.m >= 60)
{
s.h += s.m/60;
s.m = s.m%60;
}
s.pos = q.pos;
s.route = q.route;
que.push(s);
}
}
}
}
struct NODE
{
int h, m;
bool operator > (const NODE &x) const
{
if(x.h<h||(x.h==h&&x.m<m))
return true;
else
return false;
}
bool operator < (const NODE &x) const
{
if(x.h>h||(x.h==h&&x.m>m))
return true;
else
return false;
}
}t1[1001], t2[1001], tt;
NODE max(NODE a,NODE b)
{
return a > b ? a : b;
}
NODE min(NODE a,NODE b)
{
return a < b ? a : b;
}
int main()
{
int i, j, L, c, c1, c2, prev, now;
char st[31], ed[31], tmp[31];
node t;
int h, m, error, pos;
while(scanf("%d",&L)==1,L>=0)
{
error = 0;
for(i = 0; i < 1001; i++)
{
edge[i].clear();
}
no = 0;
for(i = 0; i < L; i++)
{
scanf("%s",st);
prev = getId(st);
sum[i][0] = 0;
pos = 1;
scanf("%d",&c);
while(c!=-1)
{
scanf("%s",st);
now = getId(st);
t.route = i;
t.tar = now;
t.w = c;
sum[i][pos] = sum[i][pos-1]+c;
scanf("%d",&c);
t.pos = pos++;
edge[prev].push_back(t);
prev = now;
}
scanf("%d",&ts[i][0]);
for(j = 1; j <= ts[i][0]; j++)
{
scanf("%d",&ts[i][j]);
}
}
scanf("%s%s",st,tmp);
c1 = findId(tmp);
if(c1==-1)
{
error = 1;
goto next;
}
h = atoi(st);
m = 1;
if(st[m]!=':')
{
m++;
}
m = atoi(&st[m+1]);
bfs(c1,st,dis1);
for(i = 0; i < no; i++)
{
t1[i].h = h;
t1[i].m = m+dis1[i];
if(t1[i].m >= 60)
{
t1[i].h += t1[i].m/60;
t1[i].m = t1[i].m%60;
}
}
next:
scanf("%s%s",ed,tmp);
c2 = findId(tmp);
if(error||c2==-1)
{
puts("No connection");
continue;
}
h = atoi(ed);
m = 1;
if(ed[m]!=':')
{
m++;
}
m = atoi(&ed[m+1]);
bfs(c2,ed,dis2);
error = 1;
for(i = 0; i < no; i++)
{
if(dis1[i]!=INF&&dis2[i]!=INF)
{
error = 0;
break;
}
}
if(error)
{
puts("No connection");
continue;
}
for(i = 0; i < no; i++)
{
t2[i].h = h;
t2[i].m = m+dis2[i];
if(t2[i].m >= 60)
{
t2[i].h += t2[i].m/60;
t2[i].m = t2[i].m%60;
}
}
tt = max(t1[0],t2[0]);
for(i = 1; i < no; i++)
{
tt = min(tt,max(t1[i],t2[i]));
}
printf("%d:%02d\n",tt.h%24,tt.m%60);
}
return 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?