1.Dijkstra算法
更新dis 時不要忘了判斷兩個結點之間是否存在邊,,,不然就會出錯!!!!
2.此題在更新cost,net時,不要忘記可能輸入會有1,2 ,2,1這種組合,所以應該注意他們的距離和花費關係
3.map,end容器
#include<cstdio>
#define MAX 1024
#define INTMAX 0x7fffffff
void Dijkstra(int start,int *dist,int *co);
int m,n;
int net[MAX][MAX],cost[MAX][MAX];
int main()
{
int co[MAX],dist[MAX];
while((scanf("%d%d",&n,&m)) && (n || m))
{
//對網絡初始化
for(int i=0;i<MAX;i++)
{
for(int j=0;j<MAX;j++)
{
net[i][j]=INTMAX;
cost[i][j]=INTMAX;
}
}
for(int i=0;i<MAX;i++)
{
co[i]=INTMAX;
dist[i]=INTMAX;
}
//按照輸入設置網絡值
int a,b,d,p;
for(int i=0;i<m;i++)
{
scanf("%d%d%d%d",&a,&b,&d,&p);
if(net[a-1][b-1]>d)
{
net[a-1][b-1]=d;
net[b-1][a-1]=d;
cost[a-1][b-1]=p;
cost[b-1][a-1]=p;
}
else if((net[a-1][b-1]==d) && (cost[a-1][b-1]>p))
{
cost[a-1][b-1]=p;
cost[b-1][a-1]=p;
}
}
int _start,_end;
scanf("%d%d",&_start,&_end);
Dijkstra(_start,dist,co);
printf("%d %d\n",dist[_end-1],co[_end-1]);
}
return 0;
}
void Dijkstra(int start,int *dist,int *co)
{
int view[MAX];
int mindis,minindex;
//對dist,co初始化
for(int i=0;i<n;i++)
{
dist[i]=net[start-1][i];
co[i]=cost[start-1][i];
view[i]=0;
}
dist[start-1]=0;
// co[start-1]=0;
view[start-1]=1;
for(int j=1;j<n;j++)
{
mindis=INTMAX;
for(int i=0;i<n;i++)
{
if(!view[i] && mindis > dist[i])
{
mindis=dist[i];
minindex=i;
}
}
view[minindex]=1;
//更新dist
for(int i=0;i<n;i++)
{
if(!view[i] && (net[i][minindex]+dist[minindex]<dist[i]) && (net[minindex][i]<INTMAX))
{
dist[i]=net[i][minindex]+dist[minindex];
co[i]=cost[i][minindex]+co[minindex];
}
else if(!view[i] && (net[minindex][i]<INTMAX) && (net[i][minindex]+dist[minindex]==dist[i]) && (cost[i][minindex]+co[minindex]<co[i]))
{
co[i]=cost[i][minindex]+co[minindex];
}
}
}
}