题目1008:最短路径问题
2014-03-13 17:17
399 查看
// 迪杰斯特拉算法
#include<stdio.h>
#include<vector>
using namespace std;
struct E{
int next;
int c;
int cost;
};
vector<E> edge[1001];
int Dis[1001];
int cost[1001];
bool mark[1001];
int main()
{
int n,m;
int S,T;
while(scanf("%d%d",&n,&m)!=EOF){
if(n==0 && m==0) break;
for(int i=1;i<=n;i++) edge[i].clear();
while(m--){
int a,b,c,cost;
scanf("%d%d%d%d",&a,&b,&c,&cost);
E tmp;
tmp.c=c; tmp.cost=cost;
tmp.next=b; edge[a].push_back(tmp);
tmp.next=a; edge[b].push_back(tmp);
}
scanf("%d%d",&S,&T);
for(int i=1;i<=n;i++){
Dis[i]=-1;
mark[i]=false;
}
Dis[S]=0;
mark[S]=true;
int newP=S;
for(int i=1;i<n;i++){
for(int j=0;j<edge[newP].size();j++){
int t=edge[newP][j].next;
int c=edge[newP][j].c;
int co=edge[newP][j].cost;
if(mark[t]==true) continue;
if(Dis[t]==-1 || Dis[t]>Dis[newP]+c || Dis[t]==Dis[newP]+c && cost[t]>cost[newP]+co){
Dis[t]=Dis[newP]+c;
cost[t]=cost[newP]+co;
}
}
int min=123123123;
for(int j=1;j<=n;j++){
if(mark[j]==true) continue;
if(Dis[j]==-1) continue;
if(Dis[j]<min){
min=Dis[j];
newP=j;
}
}
mark[newP]=true;
}
printf("%d %d\n",Dis[T],cost[T]);
}
return 0;
}
#include<stdio.h>
#include<vector>
using namespace std;
struct E{
int next;
int c;
int cost;
};
vector<E> edge[1001];
int Dis[1001];
int cost[1001];
bool mark[1001];
int main()
{
int n,m;
int S,T;
while(scanf("%d%d",&n,&m)!=EOF){
if(n==0 && m==0) break;
for(int i=1;i<=n;i++) edge[i].clear();
while(m--){
int a,b,c,cost;
scanf("%d%d%d%d",&a,&b,&c,&cost);
E tmp;
tmp.c=c; tmp.cost=cost;
tmp.next=b; edge[a].push_back(tmp);
tmp.next=a; edge[b].push_back(tmp);
}
scanf("%d%d",&S,&T);
for(int i=1;i<=n;i++){
Dis[i]=-1;
mark[i]=false;
}
Dis[S]=0;
mark[S]=true;
int newP=S;
for(int i=1;i<n;i++){
for(int j=0;j<edge[newP].size();j++){
int t=edge[newP][j].next;
int c=edge[newP][j].c;
int co=edge[newP][j].cost;
if(mark[t]==true) continue;
if(Dis[t]==-1 || Dis[t]>Dis[newP]+c || Dis[t]==Dis[newP]+c && cost[t]>cost[newP]+co){
Dis[t]=Dis[newP]+c;
cost[t]=cost[newP]+co;
}
}
int min=123123123;
for(int j=1;j<=n;j++){
if(mark[j]==true) continue;
if(Dis[j]==-1) continue;
if(Dis[j]<min){
min=Dis[j];
newP=j;
}
}
mark[newP]=true;
}
printf("%d %d\n",Dis[T],cost[T]);
}
return 0;
}
相关文章推荐
- 九度:题目1008:最短路径问题
- 九度OJ 题目1008:最短路径问题
- 九度 oj 题目1008:最短路径问题
- 题目1008:最短路径问题
- 九度题目1008:最短路径问题
- 题目1008:最短路径问题
- 题目1008:最短路径问题
- 题目1008:最短路径问题(2010年浙江大学计算机及软件工程研究生机试真题)
- 题目1008:最短路径问题
- Jobdu 题目1008:最短路径问题
- 题目1008:最短路径问题
- 题目1008:最短路径问题
- 九度 题目1008:最短路径问题
- 九度oj 题目1008:最短路径问题 【ZJU2010考研机试题4】【dij+dfs】
- 九度 题目1008:最短路径问题
- 题目1008:最短路径问题
- 九度oj 题目1008:最短路径问题
- 九度题目1008:最短路径问题
- 题目1008:最短路径问题
- 题目1008:最短路径问题