【版本一:无脑Dijkstra,10分】
错误原因:题意理解错误,第一个输出应该输出路径条数,而不是weight!!所以只过了一个错误点…我跪了
#include <bits/stdc++.h>
using namespace std;
const int INF=0x3fffffff;
int g[512][512],men[512],path[512],m[512];
bool visited[512];
void init(int n)
{
for(int i=0;i<n;i++)
fill(g[i],g[i]+n,INF);
fill(visited,visited+n,false);
fill(path,path+n,INF);
fill(m,m+n,0);
}
void Dijkstra(int n,int N)
{
path[n]=0;m[n]=men[n];
for(int i=0;i<N;i++)
{
int u=-1,min=INF;
for(int j=0;j<N;j++)
{
if(!visited[j] && path[j]<N)
{
u=j;min=path[j];
}
}
if(u==-1) return;
visited[u]=true;
for(int j=0;j<N;j++)
{
if(!visited[j] && path[u]+g[u][j]<path[j])
{
path[j]=path[u]+g[u][j]; //update the path weight
m[j]=m[u]+men[j]; //update the number of men
}
else if(path[u]+g[u][j]==path[j] && m[u]+men[j]>m[j]) //as many hands as possible
{
m[j]=m[u]+men[j]; //update the number of men
}
}
}
}
int main(void)
{
int N,M,C1,C2;
scanf("%d%d%d%d",&N,&M,&C1,&C2);
init(N);
for(int i=0;i<N;i++)
scanf("%d",&men[i]);
for(int i=0;i<M;i++)
{
int c1,c2,L;
scanf("%d%d%d",&c1,&c2,&L);
g[c1][c2]=L;
g[c2][c1]=L;
}
Dijkstra(C1,N);
printf("%d %d",path[C2],m[C2]);
}
【AC版本】实现题意后,又发现了版本一的代码有一处笔误…
#include <bits/stdc++.h>
using namespace std;
const int INF=0x3fffffff;
int g[512][512],men[512],path[512],m[512],num[512];
bool visited[512];
void init(int n)
{
for(int i=0;i<n;i++)
fill(g[i],g[i]+n,INF);
fill(visited,visited+n,false);
fill(path,path+n,INF);
fill(m,m+n,0);
fill(num,num+n,0);
}
void Dijkstra(int n,int N)
{
path[n]=0;m[n]=men[n];num[n]=1;
for(int i=0;i<N;i++)
{
int u=-1,min=INF;
for(int j=0;j<N;j++)
{
if(!visited[j] && path[j]<min)
{
u=j;min=path[j];
}
}
if(u==-1) return;
visited[u]=true;
for(int j=0;j<N;j++)
{
if(!visited[j]&&g[u][j]!=INF)
{
if(path[u]+g[u][j]<path[j])
{
path[j]=path[u]+g[u][j]; //update the path weight
m[j]=m[u]+men[j]; //update the number of men
num[j]=num[u]; //update the number of paths
}
else if(path[u]+g[u][j]==path[j])
{
num[j]+=num[u]; //update the number of paths
if(m[u]+men[j]>m[j]) //as many hands as possible
m[j]=m[u]+men[j]; //update the number of men
}
}
}
}
}
int main(void)
{
int N,M,C1,C2;
scanf("%d%d%d%d",&N,&M,&C1,&C2);
init(N);
for(int i=0;i<N;i++)
scanf("%d",&men[i]);
for(int i=0;i<M;i++)
{
int c1,c2,L;
scanf("%d%d%d",&c1,&c2,&L);
g[c1][c2]=L;
g[c2][c1]=L;
}
Dijkstra(C1,N);
printf("%d %d",num[C2],m[C2]);
}