> 데이터 베이스 > MySQL 튜토리얼 > PAT1003Emergency (25)

PAT1003Emergency (25)

WBOY
풀어 주다: 2016-06-07 14:50:57
원래의
926명이 탐색했습니다.

As an emergency rescue team leader of a city, you are given a special map of your country. The map shows several scattered cities connected by some roads. Amount of rescue teams in each city and the length of each road between any pair of

As an emergency rescue team leader of a city, you are given a special map of your country. The map shows several scattered cities connected by some roads. Amount of rescue teams in each city and the length of each road between any pair of cities are marked on the map. When there is an emergency call to you from some other city, your job is to lead your men to the place as quickly as possible, and at the mean time, call up as many hands on the way as possible.

Input

Each input file contains one test case. For each test case, the first line contains 4 positive integers: N (

Output

For each test case, print in one line two numbers: the number of different shortest paths between C1 and C2, and the maximum amount of rescue teams you can possibly gather.
All the numbers in a line must be separated by exactly one space, and there is no extra space allowed at the end of a line.
Sample Input5 6 0 2
1 2 1 5 3
0 1 1
0 2 2
0 3 1
1 2 1
2 4 1
3 4 1

Sample Output2 4

<code class=" hljs cpp"><span class="hljs-keyword">const</span> <span class="hljs-keyword">int</span> maxn = <span class="hljs-number">510</span>;
<span class="hljs-keyword">int</span> ans, n, m, s, t, v[maxn], dis[maxn], mapPA[maxn][maxn], x, y, z, vis[maxn];
<span class="hljs-keyword">long</span> <span class="hljs-keyword">long</span> cnt[maxn];
<span class="hljs-comment">//n-城市数量,m-道路数量,s-起点,t-终点</span>
<span class="hljs-keyword">void</span> dfs(<span class="hljs-keyword">int</span> x, <span class="hljs-keyword">int</span> y, <span class="hljs-keyword">int</span> z){
    ans = max(ans, z);
    <span class="hljs-keyword">if</span> (x == y || dis[x] == -<span class="hljs-number">1</span>)<span class="hljs-keyword">return</span>;
    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < n; ++i){
        <span class="hljs-keyword">if</span> (mapPA[x][i] != -<span class="hljs-number">1</span> && dis[x] == dis[i] + mapPA[x][i]){
            dfs(i, y, z + v[i]);
        }
    }
    dis[x] = -<span class="hljs-number">1</span>;
}
<span class="hljs-keyword">void</span> PAT1003A(){
    <span class="hljs-built_in">cin</span> >> n >> m >> s >> t;
    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < n; ++i)<span class="hljs-built_in">cin</span> >> v[i];
    <span class="hljs-built_in">memset</span>(mapPA, -<span class="hljs-number">1</span>, <span class="hljs-keyword">sizeof</span>(mapPA));
    <span class="hljs-built_in">memset</span>(dis, -<span class="hljs-number">1</span>, <span class="hljs-keyword">sizeof</span>(dis));
    <span class="hljs-keyword">while</span> (m--){
        <span class="hljs-built_in">cin</span> >> x >> y >> z;
        mapPA[x][y] = mapPA[y][x] = z;
    }
    dis[s] = <span class="hljs-number">0</span>; cnt[s] = <span class="hljs-number">1</span>;
    <span class="hljs-keyword">while</span> (<span class="hljs-keyword">true</span>){
        <span class="hljs-keyword">int</span> now = -<span class="hljs-number">1</span>;
        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < n; ++i){
            <span class="hljs-keyword">if</span> (now == -<span class="hljs-number">1</span>)now = i; <span class="hljs-keyword">else</span> now = dis[now] < dis[i] ? now : i;
        }
        <span class="hljs-keyword">if</span> (now == -<span class="hljs-number">1</span>)<span class="hljs-keyword">break</span>;
        vis[now] = <span class="hljs-number">1</span>;
        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < n; ++i)
        {
            <span class="hljs-keyword">if</span> (mapPA[now][i] != -<span class="hljs-number">1</span>){
                <span class="hljs-keyword">if</span> (dis[i] == -<span class="hljs-number">1</span> || dis[i] > dis[now] + mapPA[now][i]){ 
                    dis[i] = dis[now] + mapPA[now][i];
                    cnt[i] = cnt[now];
                }
                <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (dis[i] == dis[now] + mapPA[now][i])cnt[i] += cnt[now];
            }
        }
    }
    dfs(t, s, v[t]);
    <span class="hljs-built_in">cout</span> << cnt[t] << ans;
}
</code>
로그인 후 복사

方法二:only 深搜

<code class=" hljs cpp"><span class="hljs-comment">//深搜+回溯</span>
<span class="hljs-preprocessor">#define N 505</span>
<span class="hljs-keyword">int</span> n, m, s, e;
<span class="hljs-keyword">int</span> team[N];
<span class="hljs-keyword">int</span> numDis, minDis, maxTeam;
<span class="hljs-keyword">int</span> vis[N];
<span class="hljs-keyword">int</span> matrix[N][N];
<span class="hljs-stl_container"><span class="hljs-built_in">vector</span><<span class="hljs-keyword">int</span>></span>path;
<span class="hljs-keyword">void</span> DFS(<span class="hljs-keyword">int</span> next){
    <span class="hljs-keyword">int</span> i;
    <span class="hljs-keyword">if</span> (next == e){
        <span class="hljs-keyword">int</span> curTeam = <span class="hljs-number">0</span>, curDis = <span class="hljs-number">0</span>;
        <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>; i < path.size(); ++i){
            curTeam += team[path[i]];
        }
        <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>; i < path.size() - <span class="hljs-number">1</span>; ++i){
            curDis += matrix[path[i]][path[i + <span class="hljs-number">1</span>]];
        }
        <span class="hljs-keyword">if</span> (curDis < minDis){
            numDis = <span class="hljs-number">1</span>;
            minDis = curDis;
            maxTeam = curTeam;
        }
        <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (curDis == minDis){
            numDis++;
            <span class="hljs-keyword">if</span> (curTeam > maxTeam)maxTeam = curTeam;
        }
        <span class="hljs-keyword">return</span>;
    }

    <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>; i < n; ++i){
        <span class="hljs-keyword">if</span> (matrix[next][i] != -<span class="hljs-number">1</span>){
            <span class="hljs-keyword">if</span> (!vis[i])
            {
                vis[i] = <span class="hljs-number">1</span>;
                path.push_back(i);
                DFS(i);
                path.pop_back();
                vis[i] = <span class="hljs-number">0</span>;
            }
        }
    }
}
<span class="hljs-keyword">void</span> PAT1003A(){
    <span class="hljs-keyword">int</span> i, a, b, d, j;
    <span class="hljs-keyword">while</span> (<span class="hljs-built_in">cin</span> >> n >> m >> s >> e)
    {
        <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>; i < n; i++, matrix[i][i] = <span class="hljs-number">0</span>, vis[i] = <span class="hljs-number">0</span>)
        {
            <span class="hljs-keyword">for</span> (j = <span class="hljs-number">0</span>; j < n; j++)
            {
                matrix[i][j] = -<span class="hljs-number">1</span>;
            }
        }
        <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>; i < n; i++)
        {
            <span class="hljs-built_in">cin</span> >> team[i];
        }
        <span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>; i < m; i++)
        {
            <span class="hljs-built_in">cin</span> >> a >> b >> d;
            matrix[a][b] = matrix[b][a] = d;
        }

        path.clear();
        numDis = <span class="hljs-number">0</span>;
        minDis = <span class="hljs-number">0x7fffffff</span>;
        maxTeam = -<span class="hljs-number">1</span>;

        <span class="hljs-comment">//开始</span>
        vis[s] = <span class="hljs-number">1</span>;
        path.push_back(s);
        DFS(s);
        path.pop_back();
        vis[s] = <span class="hljs-number">0</span>;
            <span class="hljs-built_in">cout</span> << numDis << <span class="hljs-string">" "</span> << maxTeam << endl;


}</code>
로그인 후 복사
관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿