hdu 3790 最短路模板

来源:互联网 发布:auxre 如何设计软件 编辑:程序博客网 时间:2024/06/05 22:59
http://acm.hdu.edu.cn/showproblem.php?pid=3790

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <algorithm>
#include <set>
using namespace std;
#define MM(a) memset(a,0,sizeof(a))
typedef long long ll;
typedef unsigned long long ULL;
const int mod = 1000000007;
const double eps = 1e-10;
const int inf = 0x3f3f3f3f;
const int big=50000;
int max(int a,int b) {return a>b?a:b;};
int min(int a,int b) {return a<b?a:b;};
const int N = 500;
const int M=20000;
struct e{
int to,di,cost;
};
int n,m, s,t,used[1005],fd[1005][1005],fc[1005][1005],dist[1005],cost[1005];
vector<e> G[1005];

void solve()
{
memset(used,0,sizeof(used));
memset(dist,inf,sizeof(dist));
memset(cost,inf,sizeof(cost));
dist[s]=cost[s]=0;

while(1)
{
int u=-1,minn=inf;
for(int i=1;i<=n;i++)
if(!used[i]&&dist[i]<minn)
{
u=i;
minn=dist[i];
}
if(u<0) break;//已找不到可以更新的点了,能到达的所有节点已是最短路
used[u]=1;

for(int v=1;v<=n;v++)
if(!used[v]&&fd[u][v]<inf)
{
if(dist[v]>dist[u]+fd[u][v])
{
dist[v]=dist[u]+fd[u][v];
cost[v]=cost[u]+fc[u][v];
}
else if(dist[v]==dist[u]+fd[u][v])
if(cost[v]>cost[u]+fc[u][v])
cost[v]=cost[u]+fc[u][v];
//cout<<dist[1]<<" "<<dist[2]<<" "<<dist[3]<<" "<<dist[4]<<endl;
}
}
printf("%d %d\n",dist[t],cost[t]);
}

int main()
{ while(~scanf("%d %d",&n,&m))
{
int a,b,d,c;
if(!n&&!m) break;
//printf("////\n",a,b);
memset(fd,inf,sizeof(fd));
memset(fc,inf,sizeof(fc));
for(int i=1;i<=m;i++)
{
scanf("%d %d %d %d",&a,&b,&d,&c);
if(fd[a][b]>d)
{
fd[a][b]=fd[b][a]=d;
fc[a][b]=fc[b][a]=c;
}
else if(fd[a][b]==d)
if(fc[a][b]>c)
fc[a][b]=c;
}
scanf("%d %d",&s,&t);
solve();
}
return 0;
}


原创粉丝点击