【HDU 3790】双权最短路

来源:互联网 发布:师洋的淘宝店叫什么 编辑:程序博客网 时间:2024/05/23 19:18
#include <iostream>using namespace std;#define MAX 1100#define INF 99999int map[MAX][MAX];int cost[MAX][MAX];int n,m;void init(){int i,j;for(i=1;i<=MAX;i++){for(j=1;j<=MAX;j++){if(i==j){map[i][j]=0;cost[i][j]=0;}else{map[i][j]=INF;cost[i][j]=INF;}}}}void dijkstra(int start,int end){int i,j;int next,minc;int dist[MAX],visit[MAX],value[MAX];memset(visit,0,sizeof(visit));for(i=1;i<=n;i++){dist[i]=map[start][i];value[i]=cost[start][i];}visit[start]=1;for(i=1;i<n;i++){minc=INF;for(j=1;j<=n;j++){if(!visit[j] && minc>dist[j]){minc=dist[j];next=j;}}visit[next]=1;for(j=1;j<=n;j++){if(!visit[j] && map[next][j]<INF){if(dist[j]>dist[next]+map[next][j]){dist[j]=dist[next]+map[next][j];value[j]=value[next]+cost[next][j];}else if(dist[j]==(dist[next]+map[next][j])){if(value[j]>value[next]+cost[next][j])value[j]=value[next]+cost[next][j];}}}}printf("%d %d\n",dist[end],value[end]);//cout<<dist[end]<<' '<<value[end]<<endl;}int main(){while(1){int start,end;init();int i;cin>>n>>m;if(n==0 || m==0)break;for(i=0;i<m;i++){int x,y;int time,cos;cin>>x>>y>>time>>cos;if(map[x][y]>time){map[x][y]=map[y][x]=time;cost[x][y]=cost[y][x]=cos;}else if(map[x][y]==time){if(cost[x][y]>cos)cost[x][y]=cost[y][x]=cos;}}cin>>start>>end;dijkstra(start,end);}return 0;}


对于这种题需要注意的就两点,特别重要的两点,初始化,和输入的设置(if语句),再就是Dijastra在更新时候的代码语句设置了。


这道题我在Virtual judge上做的,有一个很奇怪的情况。。。就是如果用cout,那就RE了,但用printf,就AC了(G++提交),然后如果用cin,cout组合,用C++提交,就WA了=,=

不懂是为什么=,=感觉好神奇

0 0
原创粉丝点击