这道题是增加了一个花费的数据。。不过也不是大问题。。
不过最大问题是、这题的最坑爹之处。默认的测试数据里包含两个城市间有多条路径的情况。啊啊啊。。
这TM的研究生复试上机考试,会坑死一群奋斗了一年的倒霉的孩纸额。。。
#include <iostream>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXV=1005;
struct vertex
{
int d;
int p;
};
vertex cost[MAXV][MAXV];
vertex operator+(const vertex&a,const vertex&b)
{
vertex c;
c.d=a.d+b.d;
c.p=a.p+b.p;
return c;
}
void Dijkstra(int n,int v,int t)
{
vertex dist[MAXV];
bool s[MAXV];
for(int i=1;i<=n;i++)
{
dist[i]=cost[v][i];
s[i]=0;
}
s[v]=1;
int k;
for(int i=1;i<=n;i++)
{
int min=INF;
for(int j=1;j<=n;j++)
{
if(s[j]==0&&dist[j].d<min)
{
k=j;
min=dist[j].d;
}
}
s[k]=1;
for(int j=1;j<=n;j++)
{
if(s[j]==0)
{
if(cost[k][j].d<INF&&dist[k].d+cost[k][j].d<dist[j].d)
dist[j]=dist[k]+cost[k][j];
else if(dist[k].d+cost[k][j].d==dist[j].d)
if(dist[k].p+cost[k][j].p<dist[j].p)
dist[j].p=dist[k].p+cost[k][j].p;
}
}
}
printf("%d %d\n",dist[t].d,dist[t].p);
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
break;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cost[i][j].d=cost[i][j].p=INF;
}
}
int a,b,d,p;
while(m--)
{
scanf("%d%d%d%d",&a,&b,&d,&p);
if(cost[a][b].d!=INF&&cost[a][b].d>d)
{
cost[a][b].d=cost[b][a].d=d;
cost[a][b].p=cost[b][a].p=p;
}
else if(cost[a][b].d==INF)
{
cost[a][b].d=cost[b][a].d=d;
cost[a][b].p=cost[b][a].p=p;
}
}
int v,t;
scanf("%d%d",&v,&t);
Dijkstra(n,v,t);
}
return 0;
}