Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4537 Accepted Submission(s): 1356
AC代码:
#include <stdio.h>
#include <string.h>
#include <queue>
#include <vector>
#define INF 1000000000
using namespace std;
struct node
{
int to;
int w;
int ww;
}tedge;
vector<node>edge[40000];
int vis[40000],cnt[40000];
int dis[40000],cost[40000];
int n,m;
void add( int s,int e,int t,int tt)
{
tedge.to=e;
tedge.w=t;
tedge.ww=tt;
edge[s].push_back(tedge);
}
void spfa( int s)
{
queue<int>q;
int i;
memset(vis,0,sizeof(vis));
memset(cnt,0,sizeof(cnt));
for( i=1;i<=n;i++)
dis[i]=INF,cost[i]=INF;
q.push(s);
dis[s]=0,cost[s]=0;
vis[s]=1;
while(!q.empty( ))
{
int u=q.front( );
q.pop( );
vis[u]=0;
for( i=0;i<edge[u].size( );i++)
{
int x=edge[u][i].to,y=edge[u][i].w,z=edge[u][i].ww;
if(dis[x]-y>dis[u]||(dis[x]-y==dis[u]&&cost[x]-z>cost[u]))//此步关键
{
cost[x]=z+cost[u];
dis[x]=y+dis[u];
if(!vis[x])
{
q.push(x);
vis[x]=1;
if(++cnt[x]>n) return ;
}
}
}
}
return ;
}
int main( )
{
int i;
int a,b,d,p;
int s,e;
while(scanf("%d%d",&n,&m),(n||m))
{
for( i=1;i<=n;i++)
edge[i].clear( );
while(m--)
{
scanf("%d%d%d%d",&a,&b,&d,&p);
add(a,b,d,p);
add(b,a,d,p);
}
scanf("%d%d",&s,&e);
spfa(s);
printf("%d %d\n",dis[e],cost[e]);
}
return 0;
}