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 |
dijkstra。附代码。注意输入不要用cin,用scanf。#include <cmath> #include <queue> #include <iostream> #include <algorithm> #include <vector> #include <cstring> #include <queue> #include <cstdio> #include <string> #define INF 99999999 using namespace std; int init,dest,l,nop,nw; int d[1<<20]; char op[32][21]; int w[32]; int oper(int u,char oper[21]) { for(int i=0;i<l;++i) { if(oper[i]=='F') u ^= 1<<(l-1-i); else if(oper[i]=='S') u |= 1<<(l-1-i); else if(oper[i]=='C') u &= ~(1<<(l-1-i)); } return u; } bool dijkstra() { priority_queue<pair<int,int> ,vector<pair<int,int> >,greater<pair<int,int> > > PQ; bool inS[1<<20]; for(int i=0;i<(1<<20);++i) { inS[i]=false; d[i]=INF; } d[init]=0; PQ.push(make_pair(0,init)); while(!PQ.empty() && !inS[dest]) { int u=PQ.top().second; PQ.pop(); if(!inS[u]) { inS[u]=true; for(int i=0;i<nop;++i) { int v=oper(u,op[i]); if(!inS[v] && d[v]>d[u]+w[i]) { d[v]=d[u]+w[i]; PQ.push(make_pair(d[v],v)); } } } } if(d[dest]==INF) return false; else return true; } int main() { int T; scanf("%d",&T); for(int t=0;t<T;++t) { scanf("%d%d%d",&l,&nop,&nw); for(int i=0;i<nop;++i) { scanf("%s %d",op[i],&w[i]); } for(int i=0;i<nw;++i) { init=dest=0; char c; for(int pos=l-1;pos>=0;--pos) { cin>>c; if(c == '1') init |= 1<<pos; } for(int pos=l-1;pos>=0;--pos) { cin>>c; if(c == '1') dest |= 1<<pos; } if(dijkstra()) printf("%d ",d[dest]); else printf("NP "); } putchar('\n'); } } 最早用的cin,就是偷懒,想着多不了多少时间,要超肯定是算法超 谁知道在大神指导下换scanf,直接降到了400+ms Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator