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 |
优先队列 0MS 没有节点访问次数的问题纠缠#include <iostream> #include <queue> using namespace std; #define maxn 12 int n,m; //tot答案,n:city数 m:road数 struct edge { int a,b,c,p,r; }road[maxn]; struct uu { int now,money,roads; bool friend operator <(uu t,uu s) { return t.money>s.money; } }; int dist[12][5000]; int minemine() { priority_queue<uu> Q; uu p,q; p.now = 1; p.money = 0; p.roads = 2; Q.push(p); memset(dist,-1,sizeof(dist)); while(!Q.empty()) { p = Q.top(); Q.pop(); if(p.now==n) return p.money; if(dist[p.now][p.roads]!=-1)//如果以路径roads走到过p。不必再重复了 continue; dist[p.now][p.roads]= p.money; for(int j =1;j<=m;j++) { if(road[j].a==p.now)//找一个从now出发的路 { //先设置容易设置的now q.now = road[j].b; //下面设置roads q.roads = p.roads|(1<<road[j].b); if(dist[q.now][q.roads]!=-1) continue; //下面设置money int temp1 = 1<<road[j].c; if((p.roads|temp1)==p.roads)//我之前经过过C啦 q.money = p.money+road[j].p; else q.money = p.money +road[j].r; //放入优先队列 Q.push(q); } } } return -1; } int main() { int i; bool hasN; while(scanf("%d%d",&n,&m)!=EOF) { hasN = false; memset(road,-1,sizeof(road)); for(i=1;i<=m;i++) { scanf("%d%d%d%d%d",&road[i].a,&road[i].b,&road[i].c,&road[i].p,&road[i].r); if(road[i].b == n) hasN = true;//总算是可以到达的 } if(n==1) printf("0\n"); else if(!hasN) printf("impossible\n"); else{ //下面用优先队列做吧 int ans = minemine(); if(ans==-1) printf("impossible\n"); else printf("%d\n",ans); } } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator