Пример #1
0
/**
 * @function BuildManifold
 */
void HP2D::BuildManifold( Vertice _v0 ) {

    Vertice* va;
    Vertice vt;
	Vertice* vb;
    std::vector<Vertice> S; 
    std::vector<Vertice*> B; 

	InsertQueue( _v0 );

    do{
    	va = PopQueue();        
        S = Successors( va );
        
        for( int i = 0; i < S.size(); i++ ) {
            vt = S[i];
            InsertVertice( vt );
            InsertEdge( &vt, va );
            if( vt.GetDist() < mDIST_MAX ) {
                InsertQueue( vt );
            }
            B = GetAdjacent( va->Adjacent() );
            
            for( unsigned j = 0; j < B.size(); j++ ) {
                vb = B[j];
                if( InSet( vb->GetPos(), vt.Neighbors() ) ) {
                    InsertEdge( &vt, vb );
                }          
            }
        } 
    } while( GetSizeQueue() > 0 ); 
}
Пример #2
0
void main()
{
	GraphMtx gm;
	InitGraph(&gm);
	InsertVertex(&gm,'A');
	InsertVertex(&gm,'B');
	InsertVertex(&gm,'C');
	InsertVertex(&gm,'D');
	InsertVertex(&gm,'E');
	InsertVertex(&gm,'F');

	InsertEdge(&gm,'A','B',6);
	InsertEdge(&gm,'A','C',1);
	InsertEdge(&gm,'A','D',5);
	InsertEdge(&gm,'B','C',5);
	InsertEdge(&gm,'B','E',3);
	InsertEdge(&gm,'C','D',5);
	InsertEdge(&gm,'C','E',6);
	InsertEdge(&gm,'C','F',4);
	InsertEdge(&gm,'D','F',2);
	InsertEdge(&gm,'E','F',6);
	ShowGraph(&gm);

	//MinSpanTree_Prim(&gm,'E');
	MinSpanTree_Kruskal(&gm);
}
Пример #3
0
//----------------------------------------------------------------------------
bool MTMesh::Insert (int label0, int label1, int label2)
{
	// Insert the triangle.
	int t = InsertTriangle(label0, label1, label2);
	if (t == -1)
	{
		// The triangle already exists.
		return true;
	}

	// Insert the vertices of the triangle.
	int v0 = InsertVertex(label0);
	int v1 = InsertVertex(label1);
	int v2 = InsertVertex(label2);

	// Insert the edges of the triangle.
	int e0 = InsertEdge(label0, label1);
	int e1 = InsertEdge(label1, label2);
	int e2 = InsertEdge(label2, label0);

	// Set the connections among the components.
	MTTriangle& triangle = mTriangles[t];
	MTVertex& vertex0 = mVertices[v0];
	MTVertex& vertex1 = mVertices[v1];
	MTVertex& vertex2 = mVertices[v2];
	MTEdge& edge0 = mEdges[e0];
	MTEdge& edge1 = mEdges[e1];
	MTEdge& edge2 = mEdges[e2];

	// Attach edges to vertices.
	vertex0.InsertEdge(e2);
	vertex0.InsertEdge(e0);
	vertex1.InsertEdge(e0);
	vertex1.InsertEdge(e1);
	vertex2.InsertEdge(e1);
	vertex2.InsertEdge(e2);
	edge0.Vertex(0) = v0;
	edge0.Vertex(1) = v1;
	edge1.Vertex(0) = v1;
	edge1.Vertex(1) = v2;
	edge2.Vertex(0) = v2;
	edge2.Vertex(1) = v0;

	// Attach triangles to vertices.
	vertex0.InsertTriangle(t);
	vertex1.InsertTriangle(t);
	vertex2.InsertTriangle(t);
	triangle.Vertex(0) = v0;
	triangle.Vertex(1) = v1;
	triangle.Vertex(2) = v2;

	// Attach triangle to edges.
	AttachTriangleToEdge(t, triangle, 0, e0, edge0);
	AttachTriangleToEdge(t, triangle, 1, e1, edge1);
	AttachTriangleToEdge(t, triangle, 2, e2, edge2);

	return true;
}
Пример #4
0
main()
{
 int i,src,dst,nd[20],ttr=0;;
 clrscr();
 freopen("topo.in","r",stdin);
 scanf("%d%d",&n,&e);
 for(i=0;i<=n;i++)
 {
    d[i]=f[i]=NIL;
    nd[i]=i;
 }
 EdgeInit(n);
 for(i=1;i<=e;i++)
 {
   scanf("%d%d",&src,&dst);
   InsertEdge(src,dst,NIL,i);
 }
 t=0;
 for(i=1;i<=n;i++)
 {
   if(d[i]==0) {ttr+=1;printf("\nTree-%d :: ",ttr);Topo(i);}
 }
/* qsort((void *) (nd+1),n,sizeof(nd[0]),SortFunction);
 for(i=1;i<=n;i++)
 {
   printf("%d\n",*(nd+i));
 }*/
 fclose(stdin);
 printf("\nTotal tree=%d",ttr);
 printf("\nOK");
}
Пример #5
0
LGraph BuildGraph()
{
    LGraph Graph;
    Edge E;
    Vertex V;
    int Nv, i;
      
    scanf("%d", &Nv);   /* 读入顶点个数 */
    Graph = CreateGraph(Nv); /* 初始化有Nv个顶点但没有边的图 */ 
      
    scanf("%d", &(Graph->Ne));   /* 读入边数 */
    if ( Graph->Ne != 0 ) { /* 如果有边 */ 
        E = (Edge)malloc( sizeof(struct ENode) ); /* 建立边结点 */ 
        /* 读入边,格式为"起点 终点 权重",插入邻接矩阵 */
        for (i=0; i<Graph->Ne; i++) {
            scanf("%d %d %d", &E->V1, &E->V2, &E->Weight); 
            /* 注意:如果权重不是整型,Weight的读入格式要改 */
            InsertEdge( Graph, E );
        }
    } 
  
    /* 如果顶点有数据的话,读入数据 */
    for (V=0; V<Graph->Nv; V++) 
        scanf(" %c", &(Graph->G[V].Data));
  
    return Graph;
}
Пример #6
0
bool GraphAdjList::InitByEdges(FILE* stream)
{
	if(stream == NULL)
	{
		printf("null input stream\n");
		return false;
	}
	
	int i, m, n, ret;
	int x, y, cost;
	char c;
	
	ret = fscanf(stream, "%d %d", &m, &n);
	if(ret != 2)
	{
		printf("invalid format: vertex num or edge num invalid\n");
		return false;
	}
	fscanf(stream, "%c", &c);
	
	Vertex vertex;
	for(i = 0; i < m; i++)
	{
		vertex.index = i;
		PutVertex(&vertex);
	}

	for(i = 0; i < n; i++)
	{
		ret = fscanf(stream, "%d %d %d", &x, &y, &cost);
		if(ret != 3)
		{
			printf("invalid format: %d edge invalid\n", i);
			return false;
		}
		fscanf(stream, "%c", &c);

		InsertEdge(x, y, cost);
		InsertEdge(y, x, cost);
	}

	//optional: reverse the list to make sure the adjacent list has the same order with input data
	ReverseAdjList();
	
	return true;
}
Пример #7
0
bool GraphAdjList::InsertEdge(int from, int to, int cost)
{
	Edge edge;
	edge.from = from;
	edge.to = to;
	edge.cost = cost;

	return InsertEdge(&edge);
}
Пример #8
0
// テキストからノードとエッジを追加
void FieldGraph::LoadNode(char* fileName)
{
	std::ifstream in(fileName);

	int nodeMAX = 0;
	in >> nodeMAX;

	// ノードフェイズ
	for (int i = 0; i < nodeMAX; i++)
	{
		int id = i; // For文順にIndex追加
		Vector3 nodePos = VECTOR_ZERO;
		in >> nodePos.x;
		in >> nodePos.y;
		in >> nodePos.z;

		FieldNode* node;
		node = new FieldNode();
		node->m_pos = nodePos;
		
		AddNode(node);

	}

	// エッジフェイズ
	for (int i = 0; i < nodeMAX; i++)
	{

		// エッジ最大所有数
		int edgeMax = 0;
		in >> edgeMax ;

		for (int e = 0; e < edgeMax; e++)
		{
			FieldEdge* insert;
			insert = new FieldEdge();

			int myID = i;
			int toID = 0;
			in >> toID;
			int state;
			in >> (int)state;// 追加

			insert->m_from = m_nodeList[myID];
			insert->m_to = m_nodeList[toID];
			insert->m_defaultCost = 0;
			insert->m_fieldState = (FIELD_STATE)state;// 追加

			InsertEdge(m_nodeList[myID], insert);

		}

	}
}
Пример #9
0
///
/// MakeEdgeRec()
VOID MakeEdgeRec( Point lower, Point upper, int yComp, EdgePtr *edges, EdgePtr edge )
{
    edge->dxPerScan = (upper.x - lower.x) / (upper.y - lower.y);
    edge->xIntersect = lower.x;
    if( upper.y < yComp )
        edge->yUpper = upper.y - 1;
    else
        edge->yUpper = upper.y;

    InsertEdge( edges[lower.y], edge );
}
Пример #10
0
void BuildActiveList(ILint scan, Edge *active, Edge *edges[])
{
	Edge *p, *q;

	p = edges[scan]->next;
	while (p) {
		q = p->next;
		InsertEdge(active, p);
		p = q;
	}
}
Пример #11
0
void ResortActiveList(Edge *active)
{
	Edge *q, *p = active->next;

	active->next = NULL;
	while (p) {
		q = p->next;
		InsertEdge(active, p);
		p = q;
	}
}
Пример #12
0
// Store lower-y coordinate and inverse slope for each edge.  Adjust
//	and store upper-y coordinate for edges that are the lower member
//	of a monotonically increasing or decreasing pair of edges
void MakeEdgeRec(ILpointi lower, ILpointi upper, ILint yComp, Edge *edge, Edge *edges[])
{
	edge->dxPerScan = (ILfloat)(upper.x - lower.x) / (upper.y - lower.y);
	edge->xIntersect = (ILfloat)lower.x;
	if (upper.y < yComp)
		edge->yUpper = upper.y - 1;
	else
		edge->yUpper = upper.y;

	InsertEdge(edges[lower.y], edge);
}
Пример #13
0
///
/// BuildActiveList()
VOID BuildActiveList( int scan, EdgePtr *edges, EdgePtr active )
{
    EdgePtr p, q;

    p = edges[scan]->next;
    while( p ) {
        q = p->next;
        InsertEdge( active, p );
        p = q;
    }
}
Пример #14
0
bool GraphAdjList::InitByMatrix(FILE* stream)
{
	if(stream == NULL)
	{
		printf("null input stream\n");
		return false;
	}
	
	int ret, m, i, j, cost;
	char c;
	ret = fscanf(stream, "%d%c", &m, &c);
	if(ret != 2)
	{
		printf("invalid format: vertex num invalid\n");
		return false;
	}
	
	Vertex vertex;
	for(i = 0; i < m; i++)
	{
		vertex.index = i;
		PutVertex(&vertex);

		for(j = 0; j < m; j++)
		{
			ret = fscanf(stream, "%d", &cost);
			if(ret != 1)
			{
				printf("invalid format: cell(%d, %d) invalid\n");
				return false;
			}
			ret = fscanf(stream, "%c", &c);
			if(ret != 1)
			{
				printf("invalid format: no trailing char after cell(%d, %d)\n", i, j);
				return false;
			}
			
			if(cost == 0)
			{
				continue;
			}

			InsertEdge(i, j, cost);
		}
	}
	
	vexnum = m;

	//optional: reverse the list to make sure the adjacent list has the same order with input data
	ReverseAdjList();
	
	return true;
}
Пример #15
0
void main()
{
	GraphLnk gl;
	InitGraph(&gl);
	InsertVertex(&gl,'A');
	InsertVertex(&gl,'B');
	InsertVertex(&gl,'C');
	InsertVertex(&gl,'D');
	InsertVertex(&gl,'E');

	InsertEdge(&gl,'A','B');
	InsertEdge(&gl,'A','D');
	InsertEdge(&gl,'B','C');
	InsertEdge(&gl,'B','E');
	InsertEdge(&gl,'C','D');
	InsertEdge(&gl,'C','E');
	ShowGraph(&gl);

	//RemoveEdge(&gl,'A','C');
	//RemoveVertex(&gl,'C');
	ShowGraph(&gl);

	//int v = GetFirstNeighbor(&gl,'A');
	int v = GetNextNeighbor(&gl,'B','A');

	DestroyGraph(&gl);
}
Пример #16
0
void ReadTri(char *infile)
{
	FILE *fp;
	if((fp=fopen(infile,"r"))==NULL)
	{
		//文本只读方式重新打开文件
		printf("cannot open file:%s\n",infile);
		return ;
	}
	int64_t key,node1,node2, pre=-1;
	int pos = 0,count = 0, flag = -1;
	int64_t *Graph = (int64_t *)malloc(sizeof(int64_t)*NUM);
	memset(Graph,0,sizeof(int64_t)*NUM);
	while(fscanf(fp,"%lld%lld%lld",&key,&node1,&node2) != EOF)
	{
//		printf("%lld,%lld,%lld,%lld\n",key,node1,node2,pre);	
		if(key == pre|| -1==pre)
		{
			InsertEdge(Graph, node1,node2);
			InsertEdge(Graph, node2,node1);
			pre = key;
			USER = pre;
		}
		else
		{
		//	Traverse(Graph);
			BK_algo(Graph);			
			Count = 0;
			int i;
			for(i=0;i<LINE;++i)LEN[i]=0;
			for(i=0;i<NUM;++i)Graph[i]=0;
			pre = key;
			InsertEdge(Graph, node1,node2);
			InsertEdge(Graph, node2,node1);
		}
	}
//	Traverse(Graph);
	if(-1 != pre)
		BK_algo(Graph);			
}
Пример #17
0
///
/// ResortActiveList()
VOID ResortActiveList( EdgePtr active )
{
    EdgePtr p, q;

    p = active->next;
    active->next = NULL;

    while( p ) {
        q = p->next;
        InsertEdge( active, p );
        p = q;
    }
}
Пример #18
0
calcir()
{
   int a,b;
   for(a=1;a<=n;a++)
     for(b=1;b<=n;b++)

}
main()
{
 int i,src,dst,nd[20];
 clrscr();
 freopen("dfs.in","r",stdin);
 scanf("%d%d",&n,&e);
 for(i=0;i<=n;i++)
 {
    d[i]=f[i]=NIL;
    nd[i]=i;
 }
 EdgeInit(n);
 for(i=1;i<=2*e;i+=2)
 {
   scanf("%d%d",&src,&dst);
   InsertEdge(src,dst,NIL,i);
   InsertEdge(dst,src,NIL,i+1);
 }
 t=0;
 for(i=1;i<=n;i++)
 {
   if(d[i]==0) Topo(i);calcir();
 }
 qsort((void *) (nd+1),n,sizeof(nd[0]),SortFunction);
 for(i=1;i<=n;i++)
 {
   printf("%d\n",*(nd+i));
 }
 fclose(stdin);
 printf("\nOK");
}
Пример #19
0
void buildGraph_test(LGraph newgra)
{
    /* test version of buildGraph, the original graph is on page180 */
    int row[8] = {0,0,1,1,2,3,3,4};
    int col[8] = {1,5,2,6,3,4,6,5};
    for (int i = 0; i < 8; i++)
    {
        Edge newedge = (Edge)malloc(sizeof(struct edge));
        newedge->vr = row[i];
        newedge->vc = col[i];
        newedge->wt = 1;
        InsertEdge(newgra, newedge);
    }
    printf("Test graph created.\n");
}
Пример #20
0
void buildGraph(LGraph newgra)
{
    /* This function builds an directed graph adjacency lists by taking
     pairs of connections */
    int row, col, weight;
    printf("Please input a pair of connected nodes(vr-vc:w)"
        " to the %d nodes graph:\n", newgra->vertex_num);
    while (scanf("%d-%d:%d", &row, &col, &weight) == 3)
    {
        Edge newedge = (Edge)malloc(sizeof(struct edge));
        newedge->vr = row; newedge->vc = col; newedge->wt = weight;
        InsertEdge(newgra, newedge);
        printf("New edge inserted to the graph.\n");
    }
}
Пример #21
0
/*------------------------------------------------------------------
 * Create a BinaryGraphLoader reading from a binary istream.
 * NOTE: the input stream must be open with the 
 * ios::binary | ios::in mode.
 -----------------------------------------------------------------*/
BinaryGraphLoader::BinaryGraphLoader(istream &in)
  { unsigned n, ne, dest;
    unsigned i,j;

    n = readWord(in);
    for(i=0; i<n; i++)
      InsertNode(NULL);
    for(i=0; i<n; i++)
      { ne = readWord(in);
        for(j=0; j<ne; j++)
	  { dest=readWord(in);
	    InsertEdge(i, dest, NULL);
	  }
       }
   }
Пример #22
0
bool GraphAdjArray::InitByMatrix(FILE* stream)
{
	if(stream == NULL)
	{
		printf("null input stream\n");
		return false;
	}

	int ret, m, i, j, cost;
	char c;
	ret = fscanf(stream, "%d%c", &m, &c);
	if(ret != 2)
	{
		printf("invalid format: vertex num invalid\n");
		return false;
	}

	Vertex vertex;
	for(i = 0; i < m; i++)
	{
		vertex.index = i;
		PutVertex(&vertex);

		for(j = 0; j < m; j++)
		{
			ret = fscanf(stream, "%d", &cost);
			if(ret != 1)
			{
				printf("invalid format: cell(%d, %d) invalid\n");
				return false;
			}
			
			//insert one edge
			InsertEdge(i, j, cost);

			ret = fscanf(stream, "%c", &c);
			if(ret != 1)
			{
				printf("invalid format: no trailing char after cell(%d, %d)\n", i, j);
				return false;
			}
		}
	}

	vexnum = m;

	return true;
}
Пример #23
0
LGraph BuildGraph()
{
	int i;
	int nv,ne;
	LGraph newGraph;
	Edge newEdge;
	printf("input Nv,Ne:");
	scanf("%d %d",&nv,&ne);
	newGraph = CreateGraph(nv);
	newGraph->ne = ne; 
	for(i = 0; i< ne; i++){
		newEdge = (Edge)malloc(sizeof(struct ENode));
		printf("input <v1,v2>");	
		scanf("%d %d %d",&newEdge->v1,&newEdge->v2,&newEdge->weight);/*有权重就读权重呗*/
		InsertEdge(newGraph,newEdge);	
	}
	return newGraph;
}
Пример #24
0
void read(void)
{
 int i,src,dst,nd[20],ttr=0;;
 clrscr();
 freopen("topo.in","r",stdin);
 scanf("%d%d",&n,&e);
 for(i=0;i<=n;i++)
 {
    discover[i]=finish[i]=NIL;
    nd[i]=i;
 }
 EdgeInit(n);
 for(i=1;i<=e;i++)
 {
   scanf("%d%d",&src,&dst);
   InsertEdge(src,dst,NIL,i);
 }
}
Пример #25
0
// ConstructGraph
//
// Time complexity: O(n^2)
void
Graph::ConstructGraph( const Graph & resourceAllocation, const Graph & resourceRequest )
{
   MaxVertices = resourceRequest.MaxVertices;
   EdgeNode *requestPtr, *allocationPtr;
   int process, resource, i;


   // Traverse all adjacency lists
   for ( i = 0; i < resourceRequest.NumVertices; i++ )
   {
      // Save pointer to the first node in the ith list of resource request graph
      requestPtr = resourceRequest.Edge[i];

      // Traverse ith adjacency list and look for requested processes, if any
	  while ( requestPtr != NULL )
	  {
         // Save resource name
         resource = requestPtr->Vertex;

         // Save pointer to the first node in the "mysterious" list of resource
         // allocation graph
         allocationPtr = resourceAllocation.Edge[resourceAllocation.Position( resource )];

		 // See if the resource is allocated
         if ( allocationPtr != NULL )
         {
            // Save process name
            process = allocationPtr->Vertex;

            // Insert edge
            InsertEdge( resourceRequest.Vlist[i], process );
         
		 }  // end of if statement

         // Advance to the next node, if any
		requestPtr = requestPtr->Next;
      
	  } // end of while loop
   
   } // end of for loop
}
Пример #26
0
/*----------------------------------------------------------
 * Constructor
 ---------------------------------------------------------*/
ARGEdit:: ARGEdit(ARGLoader &g) 
{ count=0;
	nodes=NULL;
	lastNode=NULL;
	lastEdge=NULL;

	node_id n;
	for (n=0; n<g.NodeCount(); n++)
		InsertNode(g.GetNodeAttr(n));
	int i;
	for (n=0; n<g.NodeCount(); n++)
	{
		for (i=0; i<g.OutEdgeCount(n); i++)
		{
			void *attr; 
			node_id n2=g.GetOutEdge(n, i, &attr);
			InsertEdge(n, n2, attr);
		}
	}
}
Пример #27
0
Файл: rp.c Проект: nogna/ioopm
int main(int argc, char *argv[]){
  if (argc < 2){
    puts("Usage: rp [FILE]");
    return -1;
  }
  char *filename = argv[1];
  // createLists(filename);
  char buffer[128];
  FILE *buschart = fopen(filename, "r");
  Stop Stops=NULL;
  Edge Edges =NULL;
  char newstartname[128], newstopname[128];
  printf("Loading database: %s\n",filename);

  while(!(feof(buschart))){
    readline(buffer, 128, buschart);
    if(strcmp(buffer,"")!=0){
      Stop newStop=malloc(sizeof(struct stop));
      Edge newEdge=malloc(sizeof(struct edge));
      char *copy = malloc(strlen(buffer)+1);
      char *loc;
 
      //line
      strcpy(copy,buffer);  
      strtok (buffer,",");
      char *line =  malloc(strlen(buffer)+1);
      strcpy(line,buffer);
      loc = strchr(copy,',');
      strcpy(copy,loc+2);

      newEdge->line=malloc(strlen(buffer)+1);
      strcpy(newEdge->line,line);

      //start
      strcpy(buffer,copy);
      strtok (buffer,",");
      char *start =  malloc(strlen(buffer)+1);
      strcpy(start,buffer);
      loc = strchr(copy,',');
      strcpy(copy,loc+2);

      newStop->name = malloc(strlen(buffer)+1);
      newEdge->start = malloc(strlen(buffer)+1);
      strcpy(newstartname, start);
      newEdge->start->name=newstartname;
  
      //stop
      strcpy(buffer,copy);
      strtok (buffer,",");
      char *stop =  malloc(strlen(buffer)+1);
      strcpy(stop,buffer);
      loc = strchr(copy,',');
      strcpy(copy,loc+2);

      strcpy(newStop->name, buffer);
      newEdge->stop = malloc(strlen(buffer)+1);
      strcpy(newstopname, stop);
      newEdge->stop->name=newstopname;

      //time
      char *time =  malloc(strlen(buffer)+1);
      strcpy(time,copy);
      newEdge->time=malloc(strlen(buffer)+1);
      strcpy(newEdge->time,time);

      strcpy(buffer,"");
      newEdge->next=NULL;
      newEdge->start->route=NULL;
      newEdge->start->next=NULL;
      newEdge->stop->route=NULL;
      newEdge->stop->next=NULL;
      newStop->next=NULL;
      newStop->route=NULL;
      InsertStop(&Stops, &newStop);
      InsertEdge(&Edges, &newEdge);
    }
  }
  puts("Database loaded!\n-----------");
  int choice = -1;
  while(choice != 0){
    
    puts("1. Print Stations");
    puts("2. Get shortest route\n");
    puts("---Travel---");
    puts("3. Arrival time ");
    puts("4. Depature time");
    puts("-----------");
    puts("0. Exit MENU\n");
    puts("Please choose an option!\n");
    printf("? ");
    scanf("%d", &choice);
    while(getchar() != '\n'); // Clear stdin
    switch(choice){
    case 1:
      printStops(Stops);
      break;
    case 2:
      puts("TO BE IMPLEMENTED\n");
      break;
    case 3:
      puts("TO BE IMPLEMENTED\n");
      break;
    case 4:
      puts("TO BE IMPLEMENTED\n");
      break;
    case 0:
      puts("BYE!\n");
      break;
    default:
      puts("Invalid option, please try again!\n");
      break;
    }
  }
  return 0;
}
Пример #28
0
bool GraphAdjArray::InitByEdges(FILE* stream)
{
	if(stream == NULL)
	{
		printf("null input stream\n");
		return false;
	}
	
	int i, j, m, n, ret;
	int x, y, cost;
	char c;

	ret = fscanf(stream, "%d %d", &m, &n);
	if(ret != 2)
	{
		printf("invalid format: vertex num or edge num invalid\n");
		return false;
	}
	fscanf(stream, "%c", &c);

	Vertex vertex;
	for(i = 0; i < m; i++)
	{
		vertex.index = i;
		PutVertex(&vertex);
	}

	memset(arcs, 0, sizeof(arcs));

	for(i = 0; i < n; i++)
	{
		ret = fscanf(stream, "%d %d %d", &x, &y, &cost);
		if(ret != 3)
		{
			printf("invalid format: %d edge invalid\n", i);
			return false;
		}
		fscanf(stream, "%c", &c);

		InsertEdge(x, y, cost);
		InsertEdge(y, x, cost);
	}

	//set the cost to infinity when the graph is network
	if(kind == UDN || kind == DN)
	{
		for(i = 0; i < m; i++)
		{
			for(j = 0; j < m; j++)
			{
				if(arcs[i][j].cost == 0)
				{
					arcs[i][j].cost = INFINITY;
				}
			}
		}
	}
	
	vexnum = m;
	arcnum = n * 2;
	
	return true;
}