最短路径问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14544 Accepted Submission(s): 4446
(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<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<iomanip>
#include<list>
#include<deque>
#include<map>
#include <stdio.h>
#include <queue>
#define INF 1<<20
#define maxn 10000+5
#define ull unsigned long long
#define ll long long
#define reP(i,n) for(i=1;i<=n;i++)
#define rep(i,n) for(i=0;i<n;i++)
#define cle(a) memset(a,0,sizeof(a))
#define mod 90001
#define PI 3.141592657
const ull inf = 1LL << 61;
const double eps=1e-5;
using namespace std;
bool cmp(int a,int b){
return a>b;
}
struct edge
{
int p,dist;
}edge[1005][1005];
int n,m;
int a,b,s,t,d,p;
int spend[1005],lowcost[1005];
int vis[1005];
void dj(int s)
{
cle(vis);
vis[s]=1;
for(int i=1;i<=n;i++)
{
lowcost[i]=edge[s][i].dist;
spend[i]=edge[s][i].p;
}
int Min=INF,k;
while(1)
{
Min=INF;
for(int j=1;j<=n;j++)
if(lowcost[j]<Min&&!vis[j])
{
Min=lowcost[j];k=j;
}
if(Min==INF)break;
vis[k]=1;
for(int j=1;j<=n;j++)
{
if(lowcost[k]+edge[k][j].dist<lowcost[j]&&!vis[j])
{
lowcost[j]=lowcost[k]+edge[k][j].dist;
spend[j]=spend[k]+edge[k][j].p;
}
else if(lowcost[k]+edge[k][j].dist==lowcost[j]&&!vis[j])
if(spend[k]+edge[k][j].p<spend[j])
{
lowcost[j]=lowcost[k]+edge[k][j].dist;
spend[j]=spend[k]+edge[k][j].p;
}
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(cin>>n>>m)
{
if(n==0&&m==0)break;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
edge[i][j].dist=INF;edge[i][j].p=INF;
edge[j][i].dist=INF;edge[j][i].p=INF;
}
edge[i][i].dist=0;
edge[i][i].p=0;
}
for(int i=1;i<=m;i++)
{
//cin>>a>>b>>d>>p;
scanf("%d%d%d%d",&a,&b,&d,&p);
if(edge[a][b].dist>d)
{
edge[a][b].dist=d;edge[b][a].dist=d;
edge[a][b].p=p;edge[b][a].p=p;
}
}
scanf("%d%d",&s,&t);
dj(s);
cout<<lowcost[t]<<" "<<spend[t]<<endl;
}
return 0;
}
