PAT 1003. Emergency

1931 ワード

#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;
#define mx 505
struct edge
{
    int c;
    int len;
};
vector<edge> E[mx];
int city[mx];
int dis[mx];
int visited[mx];
int ccnt[mx];//the number of different shortest path
int csave[mx];
int main()
{
    int n,m,c1,c2;
    scanf("%d %d %d %d",&n,&m,&c1,&c2);
    for(int i=0;i<mx;i++) //init
    {
        E[i].clear();
        dis[i]=-1;
    }

    for(int i=0;i<n;i++){
        scanf("%d",&city[i]);
    }
    for(int i=0;i<m;i++)
    {
        edge tmp;
        int a,b,l;
        scanf("%d %d %d",&a,&b,&l);
        tmp.len=l;
        tmp.c=b;
        E[a].push_back(tmp);
        tmp.c=a;
        E[b].push_back(tmp);
    }
    int nowP=c1;
    dis[nowP]=0;
    visited[nowP]=1;
    csave[nowP]=city[c1];
    ccnt[nowP]=1;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<E[nowP].size();j++)
        {
            int tmpc=E[nowP][j].c;
            int d=E[nowP][j].len;
            if(visited[tmpc]==1) continue;
            if(dis[tmpc]==-1||dis[tmpc]>dis[nowP]+d)
            {
                dis[tmpc]=dis[nowP]+d;
                csave[tmpc]=city[tmpc]+csave[nowP];
                ccnt[tmpc]=ccnt[nowP];
            }else if(dis[tmpc]==dis[nowP]+d)
            {
                ccnt[tmpc]+=ccnt[nowP];
                if(csave[tmpc]<city[tmpc]+csave[nowP]){
                    csave[tmpc]=city[tmpc]+csave[nowP];
                }
            }

        }
        int min=123456789;
        for(int j=0;j<n;j++){
            if(dis[j]==-1) continue;
            if(visited[j]==1) continue;
            if(dis[j]<min)
            {
                min=dis[j];
                nowP=j;
            }
        }
        visited[nowP]=1;
    }
    printf("%d %d
",ccnt[c2],csave[c2]);     return 0; }