1030 Travel Plan (30)

来源:互联网 发布:淘宝首页1920全屏装修 编辑:程序博客网 时间:2024/05/29 08:02
#include<iostream>
#include<vector>
#include<algorithm>
#include<stdio.h>
using namespace std;


class CA
{
public:
enum{N=500,INF=0x7FFFFFFF/2};
//void init();
void run();
void getshortestlen();
void minimumcost(int c1,int cost);
private:
int n,m,sv,dv,mincost,ststlen;
int dist[N][N],cost[N][N];
int dx[N];
vector<int> path[N],tmppath,bestpath;
};






void CA::run()
{


cin>>n>>m>>sv>>dv;
fill_n((int*)dist,N*N,INF);
fill_n((int*)cost,N*N,INF);
int i,v1,v2,l,c;
for(i=0;i<m;i++)
{
cin>>v1>>v2>>l>>c;
dist[v1][v2]=dist[v2][v1]=l;
cost[v1][v2]=cost[v2][v1]=c;
}
   
mincost=INF;
getshortestlen();
minimumcost(dv,0);
//vector<int>::iterator it;
/*for(it=path[3].begin();it!=path[3].end();it++)
{
printf("%d ",*it);
}
printf("\n");*/
for(i=bestpath.size()-1;i>=0;i--)
{
printf("%d ",bestpath[i]);
}
printf("%d %d",ststlen,mincost);
}


void CA::getshortestlen()
{
bool visited[N];
int i,k;
for(i=0;i<n;i++)
visited[i]=false;
for(i=0;i<n;i++)
{
dx[i]=dist[sv][i];
//printf("%d \n",dx[i]);
}
//copy(dist[sv],dist[sv]+n,d);  
dx[sv]=0;
while(1)
{
k=-1;
for(i=0;i<n;i++)
{
if(visited[i])
continue;
if(k==-1||dx[i]<dx[k])
k=i;
}
if(k==-1)
{
break;
}
if(k==dv)
{
ststlen=dx[k];
break;
}
visited[k]=true;
for(i=0;i<n;i++)
{
if(visited[i])
continue;
if(dx[i]>dx[k]+dist[i][k])
{
path[i].clear();
dx[i]=dx[k]+dist[i][k];
path[i].push_back(k);
}
else if(dx[i]==dx[k]+dist[i][k])
{
path[i].push_back(k);
}
}
}
}


void CA::minimumcost(int c1,int cst)
{
tmppath.push_back(c1);
if(c1==sv)
{
if(cst<mincost)
{
mincost=cst;
bestpath=tmppath;
}

}
int i;
for(i=0;i<path[c1].size();i++)
{
minimumcost(path[c1][i],cst+cost[c1][path[c1][i]]);
tmppath.pop_back();
}
}


int main()
{
//freopen("test","r",stdin); 
CA *a=new CA;
//a->init();
a->run();
return 0;
}
0 0