Sample Input
1 0 0 0
Sample Output
0 2
代码:
#include<stdio.h> #include<string.h> #define Inf 0x3f3f3f3f #define MAX 510 using namespace std; struct node{ int s; // int sum; }dis[MAX]; struct node1{ //存放邻接表 int u,v,w,d; //u v 为两端点 为两点的距离 d 为到达此房子可以获得分数 int next; }e[MAX*MAX]; int head[MAX]; int num[MAX]; int n,m,start,end; int cnt=0; void add(int a,int b,int c,int d){ e[cnt].u=a; e[cnt].v=b; e[cnt].w=c; e[cnt].d=d; e[cnt].next=head[a]; head[a]=cnt++; } void Dijkstra(); int main(){ scanf("%d%d%d%d",&n,&m,&start,&end); memset(head,-1,sizeof(head)); memset(e,Inf,sizeof(e)); int i; for(i=0;i<n;i++) scanf("%d",&num[i]); //存放每个房子可以获得的分数 for(i=0;i<m;i++){ int a,b,c; scanf("%d%d%d",&a,&b,&c); add(a,b,c,num[b]); //无向图 add(b,a,c,num[a]); } Dijkstra(); printf("%d %d\n",dis[end].s,dis[end].sum+num[start]); return 0; } void Dijkstra(){ memset(dis,Inf,sizeof(dis)); int i; for(i=0;i<n;i++) dis[i].sum=0; for(i=head[start];i!=-1;i=e[i].next){ //初始化dis dis[e[i].v].s=e[i].w; dis[e[i].v].sum=e[i].d; } dis[start].s=0; dis[start].sum=0; int book[MAX]; memset(book,0,sizeof(book)); book[start]=1; int j; for(i=0;i<n-1;i++){ //有一个点已经标记 所以跑n-1次 int min=Inf; int u; for(j=0;j<n;j++){ if(!book[j]&&dis[j].s<min){ min=dis[j].s; u=j; } } book[u]=1; for(j=head[u];j!=-1;j=e[j].next){ //松弛操作 if(e[j].w<Inf){ if(dis[e[j].v].s>dis[u].s+e[j].w){ dis[e[j].v].s=dis[u].s+e[j].w; dis[e[j].v].sum=dis[u].sum+e[j].d; } else if(dis[e[j].v].s==dis[u].s+e[j].w){ if(dis[e[j].v].sum<dis[u].sum+num[e[j].v]) dis[e[j].v].sum=dis[u].sum+e[j].d; } } } } } /* 4 4 0 1 1 1 1 4 0 2 1 2 1 2 1 3 2 3 0 1 */ /* 1 0 0 0 2 */