九度教程77题-最短路径问题

题目描述:

给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
输入:
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点t。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
输出:
输出 一行有两个数, 最短距离及其花费。
样例输入:
3 2
1 2 5 6
2 3 4 5
1 3
0 0
样例输出:
9 11

#include<stdio.h>
#include<vector>
using namespace std;
struct E{
       int next;
       int weight;
       int cost;       
};

vector<E> edge[1001];

int mark[1001];
int dis[1001];
int c[1001];
 
int main(){
    int m,n;
    while (scanf("%d%d",&n,&m) != EOF && n != 0 && m!= 0){
          for (int i = 1;i <= n;i++){
              edge[i].clear();
          }
          while (m--){
                int a,b,w,co;
                scanf("%d%d%d%d",&a,&b,&w,&co);
                E tmp;
                tmp.cost = co;
                tmp.weight = w;
                tmp.next = b;
                edge[a].push_back(tmp);
                tmp.next = a;
                edge[b].push_back(tmp);      
          }
          
          for (int i = 1;i <= n;i++){
              mark[i] = 0;
              dis[i] = -1;
              c[i] = 0;    
          }
          int s,t;
          scanf("%d%d",&s,&t);
          dis[s] = 0;
          mark[s] = 1;
          c[s] = 0;
          
          int newp = s;
          for (int i = 1;i < n;i++){
              for (int j = 0;j < edge[newp].size();j++){
                  int x = edge[newp][j].next;
                  int y = edge[newp][j].weight;
                  int z = edge[newp][j].cost;
                  
                  if( mark[x] == 1)   continue;
                  if( dis[x] == -1 || dis[x] > dis[newp] + y || dis[x] == dis[newp] + y && c[x] > c[newp] + z){
                      dis[x] = dis[newp] + y;
                      c[x] = c[newp] + z;    
                  }    
              } 
              int m = 123456789;
              for (int j = 1;j <= n;j++){
                  if(mark[j] == 1)   continue;
                  if (dis[j] == -1)  continue;
                  if( dis[j] < m){
                      m = dis[j];
                      newp = j;
                  }    
              }   
              mark[newp] = 1;
          }
          printf("%d %d\n",dis[t],c[t]);
          
          
    }    
    return 0;   
}






你可能感兴趣的:(九度教程77题-最短路径问题)