Ejemplo n.º 1
0
void findPass(int v,int i,int *pass)
{
    if(i==v) cout<<'v'<<v+1<<' '; //如果经过点为起点,输出
    else
    {
        findPass(v,pass[i],pass);//否则,查找到此点的经过点
        cout<<'v'<<i+1<<' ';   //输出此点
    }
}
Ejemplo n.º 2
0
void printAnswer(){
	int i, j, count;
	//printf("Test Case No:%d\n", number);
	fprintf(output,"Test Case No:%d\n",number++);
	for (i = 0; i <= K; i++){
		if (PATH[M - 1][N - 1].count[i] == 0 || PATH[M - 1][N - 1].count[i] == 100000) { continue; }

		count = PATH[M - 1][N - 1].count[i];
		//printf("k:%d count:%d cost:%d\n", i, count, PATH[M - 1][N - 1].cost[i]);
		fprintf(output, "k:%d count:%d cost:%d\n", i, count, PATH[M - 1][N - 1].cost[i]);
		findPass(i);
	}
	//printf("\n");
	fprintf(output, "\n");
}
Ejemplo n.º 3
0
void ShortestPath(int v,int cost[][7],int dist[],const int n)
{   //v是起点,算出v到各点的最短路径
    int s[n],min,i,j;
    int pass[n];     //起点到点i中间的途径点
    for(i=0; i<=n; i++)
    {
        s[i]=0;    //解集合
        dist[i]=cost[v][i];   //记录起点到点i间的直接距离
        pass[i]=v;   //初始化不途径任何点
    }
    s[v]=1;
    dist[v]=0;
    for(i=1; i<=n; i++) //共需寻找n-1条路径
    {
        min=-1;
        for(j=0; j<=n; j++)  //找到起点到未选点中距离最短的一个,用min标记其下标
        {
            if(s[j]==0)
            {
                if(min==-1) min=j;
                else if (dist[j]<dist[min]) min=j;
            }
        }
        s[min]=1;
        printf("到点v%d的距离为%d,路径为 : ",min+1,dist[min]);
        findPass(v,pass[min],pass);
        cout<<'v'<<min+1<<endl;
        for(j=0; j<=n; j++) //经过min点是否会使起点到其他未选结点的路径变短?
        {
            if(s[j]==0&&dist[min]+cost[min][j] <dist[j])
            {   //比较两段之和与原路径哪个更短
                dist[j]=dist[min]+cost[min][j];
                pass[j]=min;  //记录途经点min
            }
        }
    }
    cout<<"起点v"<<v+1<<"到各点的最短距离:";
    for(j=0; j<=n; j++) //显示起点到各点的最短距离
        cout<<dist[j]<<' ';
    cout<<endl;
}
Ejemplo n.º 4
0
shared_ptr<RenderPass> Technique::getPass(const std::string &name)
{
    return findPass(name);
}