hdu Free DIY Tour

http://acm.hdu.edu.cn/showproblem.php?pid=1224

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <algorithm>
  4 #include <queue>
  5 #define maxn 5600
  6 using namespace std;
  7 const int inf=-600000;
  8 int e,n,m,a,b;
  9 int head[maxn*4];
 10 int dis[maxn*4];
 11 bool vis[maxn*4];
 12 int pre[maxn*4];
 13 int cnt[maxn*4];
 14 int val[maxn*4];
 15 
 16 struct node
 17 {
 18     int u,v,w,next;
 19 } p[maxn*4];
 20 
 21 void add(int u,int v,int w)
 22 {
 23     p[e].u=u;
 24     p[e].v=v;
 25     p[e].w=w;
 26     p[e].next=head[u];
 27     head[u]=e++;
 28 }
 29 
 30 bool relax(int u,int v,int w)
 31 {
 32     if(dis[v]<dis[u]+w)
 33     {
 34         dis[v]=dis[u]+w;
 35         return true;
 36     }
 37     return false;
 38 }
 39 bool spfa(int src)
 40 {
 41     memset(cnt,false,sizeof(cnt));
 42     memset(vis,false,sizeof(vis));
 43     queue<int>q;
 44     for(int i=1; i<=n; i++) dis[i]=inf;
 45     for(int i=1; i<=n; i++) pre[i]=0;
 46     dis[src]=0;
 47     vis[src]=true;
 48     q.push(src);
 49     while(!q.empty())
 50     {
 51         int uu=q.front();
 52         q.pop();
 53         vis[uu]=false;
 54         for(int i=head[uu]; i!=-1; i=p[i].next)
 55         {
 56             if(relax(uu,p[i].v,p[i].w))
 57             {
 58                 //if((++cnt[p[i].v])>n) return false;
 59                 pre[p[i].v]=uu;
 60                 if(!vis[p[i].v])
 61                 {
 62                     vis[p[i].v]=true;
 63                     q.push(p[i].v);
 64                 }
 65             }
 66         }
 67     }
 68     return true;
 69 }
 70 void inti()
 71 {
 72     memset(head,-1,sizeof(head));
 73     e=0;
 74 }
 75 
 76 void pritn(int c)
 77 {
 78     if(pre[c]!=0)
 79         pritn(pre[c]);
 80     printf("%d->",c);
 81     return ;
 82 }
 83 int main()
 84 {
 85     int t;
 86     scanf("%d",&t);
 87     for(int i=1; i<=t; i++)
 88     {
 89         inti();
 90         scanf("%d",&n);
 91         for(int j=1; j<=n; j++)
 92         {
 93             scanf("%d",&val[j]);
 94         }
 95         n++;
 96         val[n]=0;
 97         scanf("%d",&m);
 98         for(int j=0; j<m; j++)
 99         {
100             scanf("%d%d",&a,&b);
101             add(a,b,val[b]);
102         }
103         spfa(1);
104         printf("CASE %d#\n",i);
105         printf("points : %d\n",dis[n]);
106         printf("circuit : ");
107         pritn(pre[n]);
108         printf("1\n");
109         if(i!=t)
110             printf("\n");
111     }
112     return 0;
113 }
View Code

 

转载于:https://www.cnblogs.com/fanminghui/p/3673936.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值