准备考研,荒废了好多东西,希望做了正确的决定
/*********************************************************
*author:chen xin
*email:cx2pirate@gmail.com
*date:2014.09.09
* *******************************************************/
#include <stdio.h>
#include <memory.h>
#define MAXINT 0x7fffffff
#define MAXN 1005
typedef struct{
int dis,cost;
}RECORD;
RECORD record[MAXN];
RECORD map[MAXN][MAXN];
int vis[MAXN];
// O(v + e)
void init(int n);
RECORD dijkstra(int n,int m,int f,int t);
int main(void)
{
int n,m,f,t;
int u,v,dis,cost;
while(scanf("%d%d",&n,&m) && n && m){
init(n);
for(int i = 0;i < m;i++){
scanf("%d%d%d%d",&u,&v,&dis,&cost);
if(map[u][v].dis > dis || map[u][v].dis == dis && map[u][v].cost > cost){
map[u][v].dis = map[v][u].dis = dis;
map[u][v].cost = map[v][u].cost = cost;
}
}
scanf("%d%d",&f,&t);
RECORD res = dijkstra(n,m,f,t);
printf("%d %d\n",res.dis,res.cost);
}
return 0;
}
void init(int n)
{
for(int i = 1;i <= n;i++){
vis[i] = 0;
record[i].dis = record[i].cost = MAXINT;
for(int j = 1;j <= n;j++){
map[i][j].dis = map[i][j].cost = MAXINT;
}
}
}
int relaxable(RECORD u,RECORD v,RECORD edge)
{
if((u.dis + edge.dis) < v.dis){
return 1;
}
if(u.dis + edge.dis == v.dis &&
u.cost + edge.cost < v.cost){
return 1;
}
return 0;
}
RECORD dijkstra(int n,int m,int f,int t)
{
record[f].dis = record[f].cost = 0;
for(int i = 1;i <= n;i++){
int min,min_dis = MAXINT,min_cost = MAXINT;
for(int j = 1;j <= n;j++){
if(!vis[j] && (record[j].dis < min_dis ||
record[j].dis == min_dis && record[j].cost < min_cost))
{
min = j;
min_dis = record[j].dis;
min_cost = record[j].cost;
}
}
vis[min] = 1;
for(int k = 1;k <= n;k++){
if(!vis[k] && map[min][k].dis < MAXINT &&
relaxable(record[min],record[k],map[min][k]))
{
record[k].dis = record[min].dis + map[min][k].dis;
record[k].cost = record[min].cost + map[min][k].cost;
}
}
}
return record[t];
}
//11626983 2014-09-09 23:02:13 Accepted 3790 312MS 8144K 2232 B G++ 超级旅行者