Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:贡献一组数据。切换灯的时候。如果频率一样。永远都ab点永远不能到达。In Reply To:贡献一组数据。切换灯的时候。如果频率一样。永远都ab点永远不能到达。 Posted by:274856653 at 2019-09-06 17:15:41 在下水平臭。哈哈。在网上抄了一个题目发现time out。于是改进了一下 #include <stdio.h> #include<string.h> #include <iostream> #include<vector> #include<cstdio> #include<string> #include<algorithm> #include<queue> #define INF 0x3f3f3f3f #define MAX_M 28000 + 10 #define MAX_N 300 + 10 using namespace std; int source, target, N, M; int ric[MAX_N], B[MAX_N], P[MAX_N]; int to[MAX_M], w[MAX_M], pre[MAX_M], pEdge[MAX_N], dis[MAX_N]; int iIndex; bool inque[MAX_N]; queue<int>q; void initVar() { memset((char *)&ric, 0, sizeof(ric)); memset((char *)&B, 0, sizeof(B)); memset((char *)&P, 0, sizeof(P)); memset((char *)&to, 0, sizeof(to)); memset((char *)&w, 0, sizeof(w)); memset((char *)&pre, 0, sizeof(pre)); memset((char *)&pEdge, 0, sizeof(pEdge)); for(int i = 1; i<=N; i++) dis[i] = INF; } int min(int a, int b) { if(a<b) return a; else return b; } void inputData() { char flag; for(int i = 1; i<=N; i++) { getchar(); scanf("%c %d %d %d", &flag, &ric[i], &B[i], &P[i]); // printf("before flag = %c, ric[i] = %d, B[i] = %d, P[i] = %d\n", flag, ric[i], B[i], P[i]); if('B' == flag ) { ric[i] = B[i] - ric[i]; }else if('P' == flag) { ric[i] = B[i] + P[i] - ric[i]; } // printf("after flag = %d, ric[i] = %d, B[i] = %d, P[i] = %d\n", flag, ric[i], B[i], P[i]); } iIndex = 1; int a, b, weight; for(int i = 1; i<=M; i++) { scanf("%d %d %d", &a, &b, &weight); // printf("a = %d, b = %d, weight = %d\n", a, b, weight); to[iIndex] = b; w[iIndex] = weight; pre[iIndex] = pEdge[a]; pEdge[a] = iIndex++; to[iIndex] = a; w[iIndex] = weight; pre[iIndex] = pEdge[b]; pEdge[b] = iIndex++; } } void solve() { // printf("source is %d\n", source); while(q.size()) q.pop(); q.push(source); dis[source] = 0; while(q.size()) { // printf("q.size() = %d\n", q.size()); int from = q.front(); q.pop(); inque[from] = 0; // printf("starthandle from = %d, q.size() = %d\n", from, q.size()); for(int k = pEdge[from]; k; k = pre[k] ) { // printf("from = %d, k = %d, to[k] = %d, w[k] = %d\n", from, k, to[k], w[k]); int wait = 0; bool bHasPath = true; while(dis[to[k]] > dis[from] + w[k] + wait ) { int timea = (dis[from] + ric[from] + wait) % (B[from]+P[from]); int timeb = (dis[from] + ric[to[k]] + wait) % (B[to[k]]+P[to[k]]); //printf("timea = %d, B[from] = %d, timeb = %d, B[to[k]] = %d, wait = %d\n", timea, B[from], timeb, B[to[k]], wait ); int aTurnPurple = 0, aTurnBlue = 0; int bTurnPurple = 0, bTurnBlue = 0; if((timea < B[from]) != (timeb <B[to[k]]) ) //颜色不一样 { if(timea<B[from]) //a is blue, will change purple, blue; b is definite purple, blue, plue { //printf("test1 \n"); aTurnPurple = B[from] - timea; bTurnBlue = B[to[k]] + P[to[k]] -timeb; aTurnBlue = B[from] + P[from] - timea; bTurnPurple = B[to[k]] + P[to[k]] -timeb + B[to[k]]; //bTurnPurple = B[to[k]] - timeb; // printf("aTurnPurple = %d, bTurnBlue = %d, aTurnBlue = %d, bTurnPurple = %d\n",\ aTurnPurple, bTurnBlue, aTurnBlue, bTurnPurple ); if(aTurnPurple == bTurnBlue && aTurnBlue == bTurnPurple ) { bHasPath = false; break; } }else { //init a is purple, b is blue //printf("test2 \n"); aTurnBlue = B[from] + P[from] - timea; bTurnPurple = B[to[k]] -timeb; aTurnPurple =B[from] + P[from] - timea + B[from] ; bTurnBlue = B[to[k]] + P[to[k]] -timeb; // printf("aTurnPurple = %d, bTurnBlue = %d, aTurnBlue = %d, bTurnPurple = %d\n",\ aTurnPurple, bTurnBlue, aTurnBlue, bTurnPurple ); if(aTurnPurple == bTurnBlue && aTurnBlue == bTurnPurple ) { bHasPath = false; break; } } wait +=min((timea < B[from])? (B[from] - timea):(B[from] + P[from] - timea), (timeb <B[to[k]])?(B[to[k]] - timeb):(B[to[k]] + P[to[k]] -timeb ) ); // printf("wait = %d\n", wait); // }else { break; } } // printf("final wait = %d, bHasPath = %d \n", wait, bHasPath); if(!bHasPath) continue; if(dis[to[k]] > dis[from] + w[k] + wait ) { dis[to[k]] = dis[from] + w[k] + wait; // printf("update to[k] = %d, dis[to[k]] = %d\n", to[k], dis[to[k]]); if(!inque[to[k]]) { q.push(to[k]); inque[to[k]] = 1; } } } } int ans = (dis[target]<INF)? dis[target]:0; printf("%d\n", ans); } int main() { int i, j, k; while(scanf("%d %d %d %d",&source, &target, &N, &M)!=EOF) { // printf("source = %d, target = %d, N = %d, M = %d\n", source, target, N, M); // scanf("%d %d %d %d",&source, &target, &N, &M); initVar(); inputData(); solve(); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator