hdu1224
来源:互联网 发布:软件项目计划 编辑:程序博客网 时间:2024/05/21 12:46
#include<iostream>#include<stdio.h>#include<string.h>#include<algorithm>#include<cmath>#include<queue>#include<stack>#define N 200using namespace std;bool map[N][N];bool inq[N];int interest[N];int dp[N];int father[N];void spfa(int n){ int i,j,u,v; memset(inq,0,sizeof(inq)); memset(dp,0,sizeof(dp)); queue<int >q; q.push(1); dp[1]=interest[1]; inq[1]=1; while(!q.empty()) { u=q.front(); q.pop(); inq[u]=0; for(i=2;i<=n;i++) { if(map[u][i]&&dp[i]<dp[u]+interest[i]) { dp[i]=dp[u]+interest[i]; father[i]=u; if(!inq[i]) { q.push(i); inq[i]=1; } } } }}int main(){ int ca,i,j,n,m,casecount=1; int x,y; scanf("%d",&ca); while(ca--) { memset(map,0,sizeof(map)); memset(father,0,sizeof(father)); memset(interest,0,sizeof(interest)); scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&interest[i]); scanf("%d",&m); for(i=0;i<m;i++) { scanf("%d%d",&x,&y); map[x][y]=1; } spfa(n+1); printf("CASE %d#\n",casecount++); printf("points : %d\n",dp[n+1]); printf("circuit : "); stack<int>ss; i=father[n+1]; while(i!=0) { ss.push(i); i=father[i]; } while(!ss.empty()) { printf("%d->",ss.top()); ss.pop(); } printf("1\n"); if(ca) printf("\n"); }}