hdu1224

Free DIY Tour

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3838    Accepted Submission(s): 1227

Problem Description

Weiwei is a software engineer of ShiningSoft. He has just excellently fulfilled a software project with his fellow workers. His boss is so satisfied with their job that he decide to provide them a free tour around the world. It‘s a good chance to relax themselves. To most of them, it‘s the first time to go abroad so they decide to make a collective tour.

The tour company shows them a new kind of tour circuit - DIY circuit. Each circuit contains some cities which can be selected by tourists themselves. According to the company‘s statistic, each city has its own interesting point. For instance, Paris has its interesting point of 90, New York has its interesting point of 70, ect. Not any two cities in the world have straight flight so the tour company provide a map to tell its tourists whether they can got a straight flight between any two cities on the map. In order to fly back, the company has made it impossible to make a circle-flight on the half way, using the cities on the map. That is, they marked each city on the map with one number, a city with higher number has no straight flight to a city with lower number.

Note: Weiwei always starts from Hangzhou(in this problem, we assume Hangzhou is always the first city and also the last city, so we mark Hangzhou both 1 and N+1), and its interesting point is always 0.

Now as the leader of the team, Weiwei wants to make a tour as interesting as possible. If you were Weiwei, how did you DIY it?


Input

The input will contain several cases. The first line is an integer T which suggests the number of cases. Then T cases follows.
Each case will begin with an integer N(2 ≤ N ≤ 100) which is the number of cities on the map.
Then N integers follows, representing the interesting point list of the cities.
And then it is an integer M followed by M pairs of integers [Ai, Bi] (1 ≤ i ≤ M). Each pair of [Ai, Bi] indicates that a straight flight is available from City Ai to City Bi.


Output

For each case, your task is to output the maximal summation of interesting points Weiwei and his fellow workers can get through optimal DIYing and the optimal circuit. The format is as the sample. You may assume that there is only one optimal circuit.

Output a blank line between two cases.


Sample Input

2
3
0 70 90
4
1 2
1 3
2 4
3 4
3
0 90 70
4
1 2
1 3
2 4
3 4


Sample Output

CASE 1#
points : 90
circuit : 1->3->1

CASE 2#
points : 90
circuit : 1->2->1


Author

JGShining(极光炫影)

无环有向(Dag)就是求最长路,没有用dp(应该可以的),直接spfa。

有同学就是死磕 dijkstra

一组数据:

4

0 5 6 4

5

1 2

1 3

2 3

3 4

4 5

最后java代码,不习惯java,类型有点捉急

import java.util.*;
import java.math.*;
import java.util.Vector;
public class Main {
    final int N=1001;
    Vector<Edge> g[]=new Vector[N];
    int d[]=new int[N];
    boolean inq[]=new boolean[N];
    int fare[]=new int[N];
    int fa[]=new int[N];
    void dfs(int x){
        if(x==1){
            return;
        }
        dfs(fa[x]);
        System.out.print(fa[x]+"->");

    }
    int spfa(int s,int t,int n){
        for(int i=0;i<=n+1;i++){
            inq[i]=false;d[i]=10000;
        }
        Queue<Integer> q=new LinkedList<Integer> ();
        q.clear();
        d[1]=0;
        q.offer(s);
        fa[1]=-1;
        while(!q.isEmpty()){
            int u=q.poll();

            inq[u]=false;
            int sz=g[u].size();
            //System.out.print(u);
            //System.out.print(sz);
            for(int i=0;i<sz;i++){
                Edge e=g[u].get(i);
                //e.out();
                if(d[e.v]>d[u]+e.w){
                    d[e.v]=d[u]+e.w;
                    //System.out.println(u+" "+e.v+" "+d[e.v]);
                    fa[e.v]=u;
                    if(!inq[e.v]){
                        inq[e.v]=true;
                        q.offer(e.v);
                    }
                }
            }
        }
        return d[t];
    }
    void work(){
        Scanner cin=new Scanner(System.in);
        int T;
        int n,m;
        int x,y;
        int cas=1;
        T=cin.nextInt();
        while(T--!=0){
            n=cin.nextInt();
            for(int i=0;i<=n+1;i++)g[i]=new Vector<Edge>();

            for(int i=1;i<=n;i++)fare[i]=cin.nextInt();
            fare[n+1]=0;
            m=cin.nextInt();
            for(int i=1;i<=m;i++){
                x=cin.nextInt();y=cin.nextInt();
                g[x].addElement(new Edge(y, -fare[y]));
            }
            System.out.println("CASE "+(cas++) +"#");
            System.out.println("points : "+ (-spfa(1,n+1,n)) );
            System.out.printf("circuit : ");
            dfs(n+1);
            System.out.println(1);
            if(T!=0)System.out.println("");
        }

    }
    public static void main(String []args){
        new Main().work();

    }
}
class Edge{
    int v;
    int w;
    Edge(){}
    Edge (int vv,int ww){
        v=vv;
        w=ww;
    }
    void out(){
        System.out.println(v+" "+w);
    }
}

hdu1224,布布扣,bubuko.com

时间: 2024-10-23 21:56:47

hdu1224的相关文章

HDU1224 Free DIY Tour 【SPFA】

Free DIY Tour Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3939    Accepted Submission(s): 1262 Problem Description Weiwei is a software engineer of ShiningSoft. He has just excellently fulf

hdu1224 dp spfa

dp: 1 //Accepted 300 KB 15 ms 2 //dp时用到了a[n+1]可是一直没把她赋值,WA了无数次 3 //dp[i]=max(dp[j]+a[i]) j<i map[j][i]=1 4 #include <cstdio> 5 #include <cstring> 6 #include <iostream> 7 using namespace std; 8 const int imax_n = 105; 9 const int inf =

DAG最长路问题 hdu-1224

用DFS+记忆化写了一下,拓扑排序+DP的我还没弄明白.据说Codeforces 721C就是这类题目,因为有费用限制,DFS不太好写,有时间把DP法想明白来. #include <iostream> #include <cstdio> #include <vector> #include <stack> #define LL long long int using namespace std; LL sta[105]; vector<int>

hdu1224 dp(dp + 栈/父亲数组记录路径)

题意:给定 n 个城市的有趣度,并给出可以从那些城市飞到那些城市.其中第一个城市即起始城市同样也作为终点城市,有趣度为 0,旅行途中只允许按有趣度从低到高旅行,问旅行的有趣度最大是多少,并输出旅行路径. 我一开始读题的时候各种深井冰理解错想复杂,导致我一开始甚至认为第一个有趣度 0 代表的是第二个城市,因为第一个城市一定是 0 不需要给出,加上没看到题意里的第一个城市也是第 n + 1 个城市,觉得给出的能旅行的城市里出现了 n + 1 是应该的.还有关于城市联通,我以为给出的联通关系不一定就是

hdu1224 dp

#include<stdio.h> #include<string.h> #define maxn 105 int a[maxn],dp[maxn],map[maxn][maxn],pre[maxn]; int max(int x,int y) { return x>y?x:y; } void print(int p) { if(p==1)//一定从1点出发 { printf("1"); return ; } print(pre[p]); printf(&