要解决的问题
代码段
1.生成矩阵模块
#include "stdafx.h"
#include <stdlib.h>
#include <time.h>
#include <fstream.h>
#define Size 2000
int aMatrix[Size][Size];
int createMatrix()
{
int i,j;
srand(time(NULL));
fstream fs;
fs.open("Matrix2000.txt",ios::out);
for(i=0;i<Size;i++)
{
for(j=0;j<Size;j++)
{
if(i==j)
{
aMatrix[i][j]=0;
}
else
{
aMatrix[i][j]=30+rand()%71;//1+rand()%100;
}
}
}
for(i=0;i<Size;i++)
{
for(j=0;j<i;j++)
{
aMatrix[i][j]=aMatrix[j][i];
}
}
for(i=0;i<Size;i++)
{
for(j=0;j<Size;j++)
{
fs<<aMatrix[i][j]<<' ';
}
}
fs.close();
return 1;
}
int main(int argc, char* argv[])
{
createMatrix();
printf("OK!\n");
return 0;
}
2.主程序模块
#include <fstream.h>
#include <windows.h>
#include <stdio.h>
#include <process.h>
#include <string.h>
#include "stdafx.h"
#include <stdlib.h>
#include <time.h>
#define Size 2000
#define Threadnum 10//×î´óÏß³ÌÊý ÓÃÓÚ³õʼ»¯
#define Inf 1000000
int xcs;//Óû§ÊäÈëµÄÏß³ÌÊý
int c1,c2;//c1,c2״̬
HANDLE hMutex;
struct ProcParam {
int qidian;//ÿ´ÎÕÒµÄÆðµã
int zhongdian;//ÿ´ÎÕÒµÄ×îºóÒ»¸öÊý
int threadid;//Ïß³Ìid
int *qbook;//´«bookÊý×éµÄÖ¸Õë
int *qdst;//´«dstÊý×éµÄÖ¸Õë
int *qmin;//´«jubuminµÄÖ¸Õë
int pos;//¼Ç¼×îСֵµÄ×ø±ê
int *qroute;//´«Â·¾¶routeÊý×éµÄÖ¸Õë
int condition;//
int *qtm;//
};
struct ProcParam2 {
int start;
int end;
int sumtime;
int zt;
};
int **aMatrix=new int *[Size];//´´½¨¾ØÕó
int readMatrix()
{
int i,j;
// ´´½¨¶¯Ì¬¶þάÊý×éaMatrix
for(i=0;i<Size;i++)
{
aMatrix[i]=new int [Size];
}
fstream fs;
fs.open("Matrix2000.txt",ios::in); //´ò¿ªÎļþmatrix.txt£¬¶ÁÈëÊý¾Ý
for(i=0;i<Size;i++)
{
for(j=0;j<Size;j++)
{
fs>>aMatrix[i][j];
}
}
fs.close();
return 1;
}
void time_Qiu(int *qiutime)//Çóʱ¼ä
{
int t=0;
for(int i=1;i<=xcs;i++)
{
printf("Ïß³Ì%d:¿ªÊ¼ÓÚ%d£¬½áÊøÓÚ%d,¹²ÓÃʱ¼äΪ%dms\n",i,qiutime[(i-1)*2+0],qiutime[(i-1)*2+1],qiutime[(i-1)*2+1]-qiutime[(i-1)*2+0]);
qiutime[(i-1)*2+1]-qiutime[(i-1)*2+0]>t?(t=qiutime[(i-1)*2+1]-qiutime[(i-1)*2+0]):t;
}
printf("T=max{");
for(i=1;i<=xcs;i++)
{
printf("t%d ",i);
}
printf("}=%dms\n",t);
}
unsigned __stdcall biJiao(void * arg)
{
ProcParam *param;
param = (ProcParam*)arg;
if(param->condition==1) param->qtm[(param->threadid*2)+0]=GetTickCount();
int min=Inf+1;//Èç¹û³öÏÖ¶¼ÊÇÎÞÇî¡£¡£´ý¶¨
int pos;//ÊÇ·ñÒª¸³³õÖµ -1ÔõôÑù£¿
for(int j=param->qidian;j<param->zhongdian;j++)
{
if(param->qbook[j] == 0 && param->qdst[j] < min)
{
min = param->qdst[j];
pos=j;
}
}
param->qmin[param->threadid]=min;
param->pos=pos;
param->qtm[(param->threadid*2)+1]=GetTickCount();
return 0;
}
int minFind(int *book,int *dst,int dyc,int *qiutime)//dycµÚÒ»´Î
{
//int xcs=Threadnum;// ·ÖÅäµÄÏ̸߳öÊý
int eachfind=Size/xcs;//ÿ¸öÏß³ÌËù×ö¸öÊý
HANDLE hThread[Threadnum]; //HANDLE³ÆΪ¾ä±ú£¬±¾ÖÊÊÇÒ»¸ö×ÊÔ´µÄID±êʶ·û
unsigned threadID[Threadnum];
ProcParam *param=new ProcParam[Threadnum];
int jubuMin[Threadnum];//¾Ö²¿×îСֵÊý×é
for(int i=0;i<xcs;i++)//Êý×é³õʼ»¯Îª×î´óÖµ¡£
{
jubuMin[i]=Inf;
}
for(i=0;i<xcs;i++)
{
param[i].qtm=qiutime;
param[i].condition=dyc;//ÅжÏÊÇ·ñÊǵÚÒ»´Î
param[i].qmin=jubuMin;
param[i].qbook=book;
param[i].qdst=dst;
param[i].qidian=0+eachfind*i;//Æðµã
if(i!=xcs-1)
{
param[i].zhongdian=param[i].qidian+eachfind;//ÖÕµã
}
else
{
param[i].zhongdian=Size;
}
param[i].threadid=i;
hThread[i] = (HANDLE)_beginthreadex(NULL, 0, biJiao, (void*)¶m[i], 0, &threadID[i]);
}
WaitForMultipleObjects(xcs,hThread,TRUE,INFINITE);//µÈ´ýËùÓоä±ú¶¼Íê³ÉÔٱȽÏÆäÖеÄ×îСֵ ÆäÖÐÏß³ÌÊýÒªÉ趨
for(i=0;i<xcs;i++)
{
CloseHandle(hThread[i]);// ¹Ø±ÕÕâ¸öÏ̶߳ÔÓ¦µÄ¾ä±ú£¬ÊÍ·Å×ÊÔ´
}
int pos;//×îСֵËùÔÚµÄλÖÃ
int minReal=Inf;//ËùÓоֲ¿×îСֵÖеÄ×îСֵ
for(int j=0;j<xcs;j++)
{
if(jubuMin[j]<minReal)
{
minReal=jubuMin[j];
pos=param[j].pos;
}
}
return pos;
}
unsigned __stdcall refresh(void * arg)
{
ProcParam *param;
param = (ProcParam*)arg;
for(int k=param->qidian;k<(param->zhongdian);k++)
{
if((param->qdst[k] > param->qdst[param->pos] + aMatrix[param->pos][k]) && param->qbook[k] == 0)
{
param->qroute[k]=param->pos;
param->qdst[k] = param->qdst[param->pos] + aMatrix[param->pos][k];
}
}
return 0;
}
int printroute(int *route,int end,int start,int dst)
{
int newroute[Size];//ÕýÐòµÄ·¾¶
char str[Size]="";//¼Ç¼·¾¶µÄ×Ö·û´®
int i=0;
printf("v%d->v%dµÄ×î¶Ì·¾¶ÊÇ:\n",end,start);
fstream fs;
fs.open("print.txt",ios::app);//ÒÑ×·¼Ó·½Ê½´ò¿ª£¬ÈôÊÇios::out¾Í»áÖØдtxt
fs<<"v"<<end<<"->"<<"v"<<start<<"×î¶Ì·¾¶ÊÇ£º"<<endl;
while(route[end]!=-1)
{
newroute[i]=end;
end=route[end];
i++;
}
newroute[i]=end;
if(end!=start)
{
i++;
newroute[i]=start;
}
for(int k=0;k<=i;k++)
{
if(k==i)
{
printf("v%d\n",newroute[k]);
fs<<"v"<<newroute[k]<<endl;
}
else
{
printf("v%d->",newroute[k]);
fs<<"v"<<newroute[k]<<"->";
}
}
printf("¾àÀëΪ£º%d\n",dst);
fs<<"¾àÀëΪ£º"<<dst<<endl;
fs<<" "<<endl;
fs.close();
return 1;
}
int reshuffle(int *book,int *dst,int &pos,int start,int end,int *route)//ºÃÏñÕâÀï²»ÓüÓ&
{
//int xcs=Threadnum;
int eachfind=Size/xcs;//ÿ¸öÏß³ÌËù×öµÄ¸öÊý
HANDLE hThread[Threadnum]; //HANDLE³ÆΪ¾ä±ú£¬±¾ÖÊÊÇÒ»¸ö×ÊÔ´µÄID±êʶ·û
unsigned threadID[Threadnum];
ProcParam *param=new ProcParam[Threadnum];
for(int i=0;i<xcs;i++)
{
param[i].qroute=route;
param[i].qbook=book;
param[i].qdst=dst;
param[i].qidian=0+eachfind*i;//Æðµã
if(i!=xcs-1)
{
param[i].zhongdian=param[i].qidian+eachfind;//ÖÕµã
}
else
{
param[i].zhongdian=Size;
}
param[i].pos=pos;
param[i].threadid=i;
hThread[i] = (HANDLE)_beginthreadex(NULL, 0, refresh, (void*)¶m[i], 0, &threadID[i]);
}
WaitForMultipleObjects(xcs,hThread,TRUE,INFINITE);//µÈ´ýËùÓоä±ú¶¼Íê³ÉÔٱȽÏÆäÖеÄ×îСֵ ÆäÖÐÏß³ÌÊýÒªÉ趨
for(i=0;i<xcs;i++)
{
CloseHandle(hThread[i]);// ¹Ø±ÕÕâ¸öÏ̶߳ÔÓ¦µÄ¾ä±ú£¬ÊÍ·Å×ÊÔ´
}
return 0;
}
void dijkstra(int *book,int *dst,int start,int end,int &time,int option)//option 0´òӡ·¾¶ option1²»´òӡ·¾¶
{
int qiutime[1000];//ÇóÒ»ÂÖÖеĸ÷¸ö²¿·Öʱ¼ä
DWORD st,et;//starttime endtime
st=GetTickCount();
int i;
for(i=0;i<Size;i++)
{
book[i]=0;
dst[i]=aMatrix[start][i];
}
printf("\n");
book[start]=1;
int route[Size];
for(i=0;i<Size;i++)
{
route[i]=-1; //ÒòΪ³õʼËùÓнڵ㶼ԴÓÚstart£¬²»ÄÜÖ»ÊÇroute[start]=-1
}
for(i = 1; i < Size; i++)
{
int t=minFind(book,dst,i,qiutime);//×îСֵ×ø±ê
book[t]=1;
if(t==end)break;//²»ÓÃÈ«²¿±éÀúÕÒµ½¼´¿É
reshuffle(book,dst,t,start,end,route);//startÆðµãendÖÕµãÊÇΪÁËÇ󷾶 route¼Ç¼µÚn¸ö½ÚµãµÄÇ°Ò»¸ö½ÚµãÊÇʲô
}
et=GetTickCount();
time=et-st;
if(!option)
{
printroute(route,end,start,dst[end]);//´òӡ·¾¶ºÍ·¾¶³¤¶È
time_Qiu(qiutime);
}
}
int jiexi(char *a,int size,int &start,int &end)//½âÎö×Ö·û´®£¬¶ÁÈ¡ÆäÖеÄÆðµãºÍÖÕµã
{
int temp=-1,d=1,t=0;//temp=-1ÓÐv0
for(int i=size-1;i>=0;i--)
{
if(48<=a[i]&&a[i]<=57)
{
if(48<=a[i+1]&&a[i]<=57)
{
d*=10;
}
else
{
d=1;
t++;
temp=0;
}
temp+=(a[i]-48)*d;
}
else
{
if(temp>-1)
{
if(t==1)
{
start=temp;
temp=-1;
}
if(t==2)
{
end=temp;
}
}
}
}
return 1;
}
int input(int *qi_zhong)
{
FILE* f1=fopen("Input.txt","r");
if(!f1) return 0;
char buf[1024]={0};
int mount=0;//¼Ç¼¹²ÓжàÉÙ¸öÆðÖÕµã
while(!feof(f1))
{
int start,end;
memset(buf, 0, sizeof(buf));//Çå¿Õ»º³åÇø
fscanf(f1, "%s", buf);//´ÓÎļþÖжÁÈ¡Ò»¶ÎÊý¾Ý´æÈ뻺³åÇø
jiexi(buf,strlen(buf),start,end);
qi_zhong[mount++]=start;
qi_zhong[mount++]=end;
}
fclose(f1);
return mount;
}
void thread_Time()
{
for(xcs=2;xcs<11;xcs++)
{
int time,time_sum=0;
int qi_zhong[100];//¼Ç¼ÆðÖÕµãµÄÊý×é
int mount=input(qi_zhong);
if(mount)
{
for(int i=0;i<mount/2;i++)
{
int book[Size];
int dst[Size];
int start=qi_zhong[2*i];
int end=qi_zhong[2*i+1];
dijkstra(book,dst,start,end,time,1);
time_sum+=time;
}
}
printf("%d¸öỊ̈߳º%dms\n",xcs,time_sum);
fstream fs;
fs.open("time.txt",ios::app);//ios::out¾Í»áÖØдtxt
fs<<xcs<<"¸öỊ̈߳º"<<time_sum<<endl;
fs.close();
}
}
unsigned __stdcall bXing(void * arg)
{
ProcParam2 *param2;
param2=(ProcParam2*)arg;
int qi_zhong[100];//¼Ç¼ÆðÖÕµãµÄÊý×é
input(qi_zhong);
int time=0;
for(int i=param2->start;i<param2->end;i++)
{
int book[Size];
int dst[Size];
dijkstra(book,dst,qi_zhong[2*i],qi_zhong[2*i+1],time,0);
param2->sumtime+=time;
}
return 0;
}
void double_Find()
{
HANDLE hThread[2];
unsigned threadID[2];
ProcParam2 *param2=new ProcParam2[2];
int qi_zhong[100];//¼Ç¼ÆðÖÕµãµÄÊý×é
int mount=input(qi_zhong);
int n=mount/2;//¼¸¶ÔÆðÖÕµã
int k=n/2;
if(readMatrix())
{
for(int i=0;i<2;i++)
{
param2[i].start=0+i*k;
param2[i].sumtime=0;
if(i!=1)
{
param2[i].end=param2[i].start+k;
}
else
{
param2[i].end=n;
}
hThread[i] = (HANDLE)_beginthreadex(NULL, 0, bXing, (void*)¶m2[i], 0, &threadID[i]);
}
WaitForMultipleObjects(2,hThread,TRUE,INFINITE);
CloseHandle(hThread[0]);CloseHandle(hThread[1]);
printf("Ëã·¨¹²ÓÃ=%dms\n",param2[0].sumtime+param2[1].sumtime);
}
}
int chaxun()
{
printf("**** ÇëÊäÈëÊ×Ä©½ÚµãºÅ ****\n");
int a,b;
int start,end;
scanf("%d %d",&a,&b);
FILE* f1=fopen("print.txt","r");
if(!f1) return 0;
char buf[1024]={0};
while(!feof(f1))
{
memset(buf, 0, sizeof(buf));//Çå¿Õ»º³åÇø
fscanf(f1, "%s", buf);//´ÓÎļþÖжÁÈ¡Ò»¶ÎÊý¾Ý´æÈ뻺³åÇø
jiexi(buf,strlen(buf),start,end);
if(start==b&&end==a)
{
for(int i=0;i<strlen(buf);i++)
{
printf("%c",buf[i]);
}
printf("\n");
memset(buf, 0, sizeof(buf));//Çå¿Õ»º³åÇø
fscanf(f1, "%s", buf);
for(i=0;i<strlen(buf);i++)
{
printf("%c",buf[i]);
}
printf("\n");
memset(buf, 0, sizeof(buf));//Çå¿Õ»º³åÇø
fscanf(f1, "%s", buf);
for(i=0;i<strlen(buf);i++)
{
printf("%c",buf[i]);
}
printf("\n");
return 1;
}
}
printf("ÕÒ²»µ½\n");
fclose(f1);
}
void main()
{
while(1)
{
printf("***************************************\n");
printf("**** ²âÊÔÇëÊäÈë1 ****\n");
printf("**** ͳ¼ÆÇëÊäÈë2 ****\n");
printf("**** ²éѯÇëÊäÈë3 ****\n");
printf("***************************************\n");
int option;
scanf("%d",&option);
system("cls");
switch(option)
{
case 1:
printf("***************************************\n");
printf("**** ÇëÊäÈëÏß³ÌÊý ****\n");
printf("***************************************\n");
scanf("%d",&xcs);
double_Find();break;
case 2:thread_Time();break;
case 3:chaxun();break;
default:printf("ÇëÊäÈëÕýÈ·µÄÊý\n");
}
getchar();
}
}
3.输入模块
//input.txt
v8->v10
v231->v32
v342->v1034
v986->v128
v86->v1234
实验分析