HUD 1224 Free DIY Tour(最短路spfa)

来源:互联网 发布:詹姆斯2017总决赛数据 编辑:程序博客网 时间:2024/06/05 00:10

【题目链接】
http://acm.hdu.edu.cn/showproblem.php?pid=1224

题目意思

题目大意:给定n个城市,每个城市都有个有趣度,m条路(单项),问你从城市1到其他城市最后再飞回城市1最大的有趣度和。

解题思路

题目也给提示了,把终点设为n+1,又因为题目说道路都是从小数值城市到大数值的,这样就不会形成环。每条路的权值相当于目的地的有趣度,所以题目就相当求城市n+1的最大有趣度了,所以用最短路思来写。

代码部分

#include <bits/stdc++.h>using namespace std;#define LL long longconst int maxn=105;const int INF=0x3f3f3f;int n,m;int inq[maxn];   ///存储有趣度int dis[maxn];   ///存储最小路径int vis[maxn];int pre[maxn];   ///存储上一个到达点int a[maxn][maxn];  ///地图void spfa (){    queue<int >q;    q.push(1);    dis[1]=0;    while(!q.empty())    {        int c=q.front();        q.pop();        for (int i=1;i<=n;i++)        {            if (dis[i]<dis[c]+a[c][i])            {                dis[i]=dis[c]+a[c][i];                pre[i]=c;                if (!vis[i])  ///判断是否已经在队列里                {                    vis[i]=1;                    q.push(i);                }            }        }        vis[c]=0; ///必须标记回去    }}void prin(int j){    if (pre[j]==-1)    {        printf("1");        return;    }    prin(pre[j]);    if (j==n)        printf("->%d",1);    else    printf("->%d",j);}int main(){    int t,cas=1;    scanf("%d",&t);    while (t--)    {        memset(pre,-1,sizeof(pre));        memset(vis,0,sizeof(vis));        memset(dis,-INF,sizeof(dis));        memset(a,-INF,sizeof(a));        scanf("%d",&n);        n++;        for (int i=1;i<n;i++)        {            scanf("%d",&inq[i]);        }        scanf("%d",&m);        for(int i=0;i<m;i++)        {            int x,y;            scanf("%d %d",&x,&y);            if (y==n)                a[x][y]=0;            else a[x][y]=inq[y];        }        spfa();        if(cas!=1)puts("");        printf("CASE %d#\n",cas++);        printf("points : %d\n",dis[n]);        printf("circuit : ");        prin(n);        printf("\n");    }}