信息工程系軟件技術(shù)學(xué)生課程表(拓?fù)渑判颍?/p>

創(chuàng)新互聯(lián)公司聯(lián)系熱線:13518219792,為您提供成都網(wǎng)站建設(shè)網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),創(chuàng)新互聯(lián)公司網(wǎng)頁(yè)制作領(lǐng)域十多年,包括成都辦公窗簾等多個(gè)領(lǐng)域擁有多年的網(wǎng)站營(yíng)銷經(jīng)驗(yàn),選擇創(chuàng)新互聯(lián)公司,為企業(yè)錦上添花。
拓?fù)鋱D為:(圖不好粘貼)
運(yùn)用拓?fù)涓拍钆判虻慕Y(jié)果:
C1 , C9 , C3 , C2 , C7 , C4, C5 , C8 , C6
C1計(jì)算機(jī)應(yīng)用基礎(chǔ) C2 C語(yǔ)言 C3 VB語(yǔ)言 C4 JSP C5數(shù)字邏輯電路 C6軟件工程
C7計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ) C8 Java語(yǔ)言 C9計(jì)算機(jī)數(shù)學(xué)基礎(chǔ)
/*-------------------------------主類-----------------------------*/
public class Navy1 {
public static void main(String[] args) {
topology(); //調(diào)用拓?fù)涞臉?gòu)造方法
}
public static void topology() { //構(gòu)造拓?fù)浞椒?/p>
/**
聲明拓?fù)鋱D中的元素
定義節(jié)點(diǎn)和節(jié)點(diǎn)之間的關(guān)系
Entry(a,b)a為b的前導(dǎo)
**/
Entry[] relations = { new Entry(9, 2), new Entry(3,7),
new Entry(7, 5), new Entry(5, 8), new Entry(8, 6),
new Entry(4, 6), new Entry(1, 3), new Entry(7, 4),
new Entry(9, 5), new Entry(2, 8) };
int n = 9;
int n1 = 9;
/*計(jì)算拓?fù)鋱D中節(jié)點(diǎn)數(shù)*/
int[] count = { -1, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
/*開辟內(nèi)存空間*/
Node[] top = { null, null, null, null, null, null, null, null, null, null };
Node p = null;
for (int i = 0; i relations.length; i++) {
count[relations[i].k]++;
p = new Node();
p.suc = relations[i].k;
p.next = top[relations[i].j];
top[relations[i].j] = p;
}
int r = 0;
int[] qlink = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
for (int i = 1; i = n; i++) {
if (count[i] == 0) {
qlink[r] = i;
r = i;
}
}
int f = qlink[0];
System.out.println("題目及要求:");
System.out.println("課程排課程序。寫一個(gè)程序,實(shí)現(xiàn)對(duì)某個(gè)專業(yè)的課程進(jìn)行排課的功能。");
System.out.println("已知某專業(yè)的課程和它們的前導(dǎo)和后續(xù)關(guān)系(以有向圖的形式表示),");
System.out.println("請(qǐng)用拓?fù)渑判蛩惴ㄇ蟪鲞@些課程的優(yōu)先關(guān)系并輸出一種排課結(jié)果");
System.out.println("--------------------------------------");
System.out.println("08信息工程系軟件技術(shù)課程表(拓?fù)渑判颍?);
while (true)
{
System.out.println(f);
if (f == 0) //結(jié)束條件
{
break;
}
else
{
n1--;
p = top[f];
while (true)
{
if (p == null)
{
break;
}
else
{
count[p.suc]--;
if (count[p.suc] == 0)
{
qlink[r] = p.suc;
r = p.suc;
}
p = p.next;
}
}
f = qlink[f];
}
}
System.out.println("結(jié)束的標(biāo)志為:" + n1);
System.out.println("--------------------------------------------");
System.out.println("注釋(數(shù)字對(duì)應(yīng)的課程):");
System.out.println("1 計(jì)算機(jī)應(yīng)用基礎(chǔ) 2 C語(yǔ)言 3 VB語(yǔ)言 ");
System.out.println("4 JSP 5 數(shù)字邏輯電路 6 軟件工程");
System.out.println("7 計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ) 8 Java語(yǔ)言 9 計(jì)算機(jī)數(shù)學(xué)基礎(chǔ)");
System.out.println("--------------------------------------------");
}
/*構(gòu)造元素類*/
private static class Entry
{
public Entry(int begin, int end) //定義開始元素和結(jié)束元素
{
this.j = begin;
this.k = end;
}
int j;
int k;
}
/*聲明節(jié)點(diǎn)的后繼*/
private static class Node
{
public Node(int suc, Node next)
{
this.suc = suc;
this.next = next;
}
public Node()
{
}
int suc;
Node next;
}
}
拓?fù)渑判蚴怯邢驁D的一個(gè)重要操作。在給定的有向圖G中,若頂點(diǎn)序列vi1,vi2,...,vin滿足下列條件:若在有向圖G中從頂點(diǎn)vi到頂點(diǎn)vj有一條路徑,則在序列中頂點(diǎn)vi必在頂點(diǎn)vj之前,便稱這個(gè)序列為一個(gè)拓?fù)湫蛄小G笠粋€(gè)有向圖拓?fù)湫蛄械倪^程稱為拓?fù)渑判颉?/p>
舉例:計(jì)算機(jī)專業(yè)的學(xué)生應(yīng)該學(xué)習(xí)的部分課程及其每門課程所需要的先修課程。
拓?fù)渑判虻姆椒ǎ?/p>
(1)從圖中選擇一個(gè)入度為0的頂點(diǎn)且輸出之;
(2)從圖中刪掉該頂點(diǎn)及其所有以該頂點(diǎn)為弧尾的弧;
反復(fù)執(zhí)行這兩個(gè)步驟,直到所有的頂點(diǎn)都被輸出,輸出的序列就是這個(gè)無(wú)環(huán)有向圖的拓?fù)湫蛄小<?xì)心的讀者可能會(huì)發(fā)現(xiàn):在每一時(shí)刻,可能同時(shí)存在多個(gè)入度為0的頂點(diǎn),選擇注:表中c1~c9列表示的是每個(gè)頂點(diǎn)的入度。
下面我們討論一下如何實(shí)現(xiàn)拓?fù)渑判虻乃惴ā<僭O(shè)有向圖以鄰接表的形式存儲(chǔ)。
下面給出算法實(shí)現(xiàn)的基本過程:
{ 將所有入度為0的頂點(diǎn)入棧;
當(dāng)棧非空時(shí)重復(fù)執(zhí)行下列操作:
從棧中退出頂點(diǎn)k;
(1)將k頂點(diǎn)的信息輸出;
(2)將與k鄰接的所有頂點(diǎn)的入度減1。 }#defineMAX_VERTEX_NUM30//最大頂點(diǎn)個(gè)數(shù)typestructEdgeLinklist{//邊結(jié)點(diǎn)intadjvex;structEdgeLinklist*next;}EdgeLinklist;typedefstructVexLinklist{//頂點(diǎn)結(jié)點(diǎn)Elemtypeelem;intindegree;//記錄頂點(diǎn)的入度EdgeLinklist*firstedge;}VexLinklist,AdjList[MAX_VERTEX_NUM];下面是拓?fù)渑判虻耐暾惴ā? StatusTopologicalSort(AdjListadj){InitStack(s);for(i=0;iMAX_VERTEX_NUM-1;i++)if(adj.indegree==0)Push(s,i);while(!StackEmpty(s)){Pop(s,i);printf(i);for(p=adj.firstedge;p;p=p-next){adj.indegree-=1;if(adj.indegree==0)Push(s,i);}
#define MAXV 30
#define OK 1
#define ERROR 0
typedef char VertexType;
typedef int status;
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode{
VertexType data;
ArcNode *firstarc;
}VNode,AdjList[MAXV ];
typedef struct{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
int LocateVex(ALGraph G,char m);
status Creat_Graph1(ALGraph G);
int dfs_topsort(ALGraph g,int n);//拓?fù)渑判蛩惴?/p>
void dfs(ALGraph g,int v,intflag);//深度優(yōu)先搜索
void Menuselect();
頭文件
#includestdio.h
#includemalloc.h
#includestdlib.h
#includeiostream.h
#include"head.h"
int visited[MAXV];
int finished[MAXV];
int dfs_topsort(ALGraph g,int n)
{
int flag=1,i;
for(i=0;in;i++) //置初值
{
visited[i]=0;
finished[i]=1;
}
i=0; //從編號(hào)為0的頂點(diǎn)開始遍歷
while(flagin)
{
if(visited[i]==0)
{ i++;
dfs(g,i,flag);}
}
return flag;
}
void dfs(ALGraph g,int v,intflag)
{
ArcNode *p;
printf("%d\n",v);
finished[v]=0;
visited[v]=0;
p=g.vertices[v]. firstarc; //找頂點(diǎn)V的第一條弧
while(p!=NULL)
{
if(visited[p-adjvex]==0)
{
dfs(g,p-adjvex,flag);
finished[p-adjvex ]=1;
}
p=p-nextarc ;
}
}
int LocateVex(ALGraph G,char m){
int i;
for(i=0;iG.vexnum;i++)
if(G.vertices[i].data==m)return i;
return ERROR;
}
status Creat_Graph1(ALGraph G){
int i,j,r;char m,n;ArcNode *p;
printf("請(qǐng)輸入頂點(diǎn)數(shù):");
scanf("%d",G.vexnum);
printf("請(qǐng)輸入邊數(shù):");
scanf("%d",G.arcnum);
printf("請(qǐng)輸入圖的所有頂點(diǎn):");
for(i=0;iG.vexnum;i++)
{cinG.vertices[i].data;G.vertices[i].firstarc=NULL;}
printf("請(qǐng)輸入圖的所有邊,如A-B邊記為AB,:\n");
for(r=0;rG.arcnum;r++){
cinm;cinn;
i=LocateVex(G,m);j=LocateVex(G,n);
p=(ArcNode*)malloc(sizeof(ArcNode));
p-adjvex=j;
p-nextarc=G.vertices[i].firstarc;
G.vertices[i].firstarc=p;
}
return OK;
}
void Menuselect(){
int done=1,select,i;
ALGraph g;
printf("please input select number");
while(done){
printf("請(qǐng)輸入操作碼:");
scanf("%d",select);
switch(select){
case 1:
if(Creat_Graph1(g))printf("OK");
printf("\n\n");
break;
case 2:
dfs_topsort( g,g.vexnum);
printf("\n\n");
break;
case 3:
done=0;
break;
default:printf("輸入的操作碼錯(cuò)誤\n\n");
}
}
}
實(shí)現(xiàn)文件
#includestdio.h
#includemalloc.h
#includestdlib.h
#includeiostream.h
#include"head.h"
void main()
{
printf("圖的拓?fù)渑判?);
Menuselect();
}
主文件
public class Arr{
//數(shù)組
int[] arr = {3,1,6,4,5,10,2};
//對(duì)數(shù)組進(jìn)行簡(jiǎn)單的排序
java.util.Arrays.sort(arr);
//輸出最大值、最小值
System.out.println("最大值:" + arr[arr.length-1] +"\n最小值:" + arr[0]);
//從小到大輸出
System.out.println(java.util.Arrays.toString(arr));
}
排序算法有很多,所以在特定情景中使用哪一種算法很重要。為了選擇合適的算法,可以按照建議的順序考慮以下標(biāo)準(zhǔn):
(1)執(zhí)行時(shí)間
(2)存儲(chǔ)空間
(3)編程工作
對(duì)于數(shù)據(jù)量較小的情形,(1)(2)差別不大,主要考慮(3);而對(duì)于數(shù)據(jù)量大的,(1)為首要。
主要排序法有:
一、冒泡(Bubble)排序——相鄰交換
二、選擇排序——每次最小/大排在相應(yīng)的位置
三、插入排序——將下一個(gè)插入已排好的序列中
四、殼(Shell)排序——縮小增量
五、歸并排序
六、快速排序
七、堆排序
八、拓?fù)渑判?/p>
一、冒泡(Bubble)排序
----------------------------------Code 從小到大排序n個(gè)數(shù)------------------------------------
void BubbleSortArray()
{
for(int i=1;in;i++)
{
for(int j=0;in-i;j++)
{
if(a[j]a[j+1])//比較交換相鄰元素
{
int temp;
temp=a[j]; a[j]=a[j+1]; a[j+1]=temp;
}
}
}
}
-------------------------------------------------Code------------------------------------------------
效率 O(n2),適用于排序小列表。
二、選擇排序
----------------------------------Code 從小到大排序n個(gè)數(shù)--------------------------------
void SelectSortArray()
{
int min_index;
for(int i=0;in-1;i++)
{
min_index=i;
for(int j=i+1;jn;j++)//每次掃描選擇最小項(xiàng)
if(arr[j]arr[min_index]) min_index=j;
if(min_index!=i)//找到最小項(xiàng)交換,即將這一項(xiàng)移到列表中的正確位置
{
int temp;
temp=arr[i]; arr[i]=arr[min_index]; arr[min_index]=temp;
}
}
}
-------------------------------------------------Code-----------------------------------------
效率O(n2),適用于排序小的列表。
三、插入排序
--------------------------------------------Code 從小到大排序n個(gè)數(shù)-------------------------------------
void InsertSortArray()
{
for(int i=1;in;i++)//循環(huán)從第二個(gè)數(shù)組元素開始,因?yàn)閍rr[0]作為最初已排序部分
{
int temp=arr[i];//temp標(biāo)記為未排序第一個(gè)元素
int j=i-1;
while (j=0 arr[j]temp)/*將temp與已排序元素從小到大比較,尋找temp應(yīng)插入的位置*/
{
arr[j+1]=arr[j];
j--;
}
arr[j+1]=temp;
}
}
------------------------------Code--------------------------------------------------------------
最佳效率O(n);最糟效率O(n2)與冒泡、選擇相同,適用于排序小列表
若列表基本有序,則插入排序比冒泡、選擇更有效率。
四、殼(Shell)排序——縮小增量排序
-------------------------------------Code 從小到大排序n個(gè)數(shù)-------------------------------------
void ShellSortArray()
{
for(int incr=3;incr0;incr--)//增量遞減,以增量3,2,1為例
{
for(int L=0;L(n-1)/incr;L++)//重復(fù)分成的每個(gè)子列表
{
for(int i=L+incr;in;i+=incr)//對(duì)每個(gè)子列表應(yīng)用插入排序
{
int temp=arr[i];
int j=i-incr;
while(j=0arr[j]temp)
{
arr[j+incr]=arr[j];
j-=incr;
}
arr[j+incr]=temp;
}
}
}
}
--------------------------------------Code-------------------------------------------
適用于排序小列表。
效率估計(jì)O(nlog2^n)~O(n^1.5),取決于增量值的最初大小。建議使用質(zhì)數(shù)作為增量值,因?yàn)槿绻隽恐凳?的冪,則在下一個(gè)通道中會(huì)再次比較相同的元素。
殼(Shell)排序改進(jìn)了插入排序,減少了比較的次數(shù)。是不穩(wěn)定的排序,因?yàn)榕判蜻^程中元素可能會(huì)前后跳躍。
五、歸并排序
----------------------------------------------Code 從小到大排序---------------------------------------
void MergeSort(int low,int high)
{
if(low=high) return;//每個(gè)子列表中剩下一個(gè)元素時(shí)停止
else int mid=(low+high)/2;/*將列表劃分成相等的兩個(gè)子列表,若有奇數(shù)個(gè)元素,則在左邊子列表大于右側(cè)子列表*/
MergeSort(low,mid);//子列表進(jìn)一步劃分
MergeSort(mid+1,high);
int [] B=new int [high-low+1];//新建一個(gè)數(shù)組,用于存放歸并的元素
for(int i=low,j=mid+1,k=low;i=mid j=high;k++)/*兩個(gè)子列表進(jìn)行排序歸并,直到兩個(gè)子列表中的一個(gè)結(jié)束*/
{
if (arr[i]=arr[j];)
{
B[k]=arr[i];
I++;
}
else
{ B[k]=arr[j]; j++; }
}
for( ;j=high;j++,k++)//如果第二個(gè)子列表中仍然有元素,則追加到新列表
B[k]=arr[j];
for( ;i=mid;i++,k++)//如果在第一個(gè)子列表中仍然有元素,則追加到新列表中
B[k]=arr[i];
for(int z=0;zhigh-low+1;z++)//將排序的數(shù)組B的 所有元素復(fù)制到原始數(shù)組arr中
arr[z]=B[z];
}
-----------------------------------------------------Code---------------------------------------------------
效率O(nlogn),歸并的最佳、平均和最糟用例效率之間沒有差異。
適用于排序大列表,基于分治法。
六、快速排序
------------------------------------Code--------------------------------------------
/*快速排序的算法思想:選定一個(gè)樞紐元素,對(duì)待排序序列進(jìn)行分割,分割之后的序列一個(gè)部分小于樞紐元素,一個(gè)部分大于樞紐元素,再對(duì)這兩個(gè)分割好的子序列進(jìn)行上述的過程。*/ void swap(int a,int b){int t;t =a ;a =b ;b =t ;}
int Partition(int [] arr,int low,int high)
{
int pivot=arr[low];//采用子序列的第一個(gè)元素作為樞紐元素
while (low high)
{
//從后往前栽后半部分中尋找第一個(gè)小于樞紐元素的元素
while (low high arr[high] = pivot)
{
--high;
}
//將這個(gè)比樞紐元素小的元素交換到前半部分
swap(arr[low], arr[high]);
//從前往后在前半部分中尋找第一個(gè)大于樞紐元素的元素
while (low high arr [low ]=pivot )
{
++low ;
}
swap (arr [low ],arr [high ]);//將這個(gè)樞紐元素大的元素交換到后半部分
}
return low ;//返回樞紐元素所在的位置
}
void QuickSort(int [] a,int low,int high)
{
if (low high )
{
int n=Partition (a ,low ,high );
QuickSort (a ,low ,n );
QuickSort (a ,n +1,high );
}
}
----------------------------------------Code-------------------------------------
平均效率O(nlogn),適用于排序大列表。
此算法的總時(shí)間取決于樞紐值的位置;選擇第一個(gè)元素作為樞紐,可能導(dǎo)致O(n2)的最糟用例效率。若數(shù)基本有序,效率反而最差。選項(xiàng)中間值作為樞紐,效率是O(nlogn)。
基于分治法。
七、堆排序
最大堆:后者任一非終端節(jié)點(diǎn)的關(guān)鍵字均大于或等于它的左、右孩子的關(guān)鍵字,此時(shí)位于堆頂?shù)墓?jié)點(diǎn)的關(guān)鍵字是整個(gè)序列中最大的。
思想:
(1)令i=l,并令temp= kl ;
(2)計(jì)算i的左孩子j=2i+1;
(3)若j=n-1,則轉(zhuǎn)(4),否則轉(zhuǎn)(6);
(4)比較kj和kj+1,若kj+1kj,則令j=j(luò)+1,否則j不變;
(5)比較temp和kj,若kjtemp,則令ki等于kj,并令i=j,j=2i+1,并轉(zhuǎn)(3),否則轉(zhuǎn)(6)
(6)令ki等于temp,結(jié)束。
-----------------------------------------Code---------------------------
void HeapSort(SeqIAst R)
{ //對(duì)R[1..n]進(jìn)行堆排序,不妨用R[0]做暫存單元 int I; BuildHeap(R); //將R[1-n]建成初始堆for(i=n;i1;i--) //對(duì)當(dāng)前無(wú)序區(qū)R[1..i]進(jìn)行堆排序,共做n-1趟。{ R[0]=R[1]; R[1]=R[i]; R[i]=R[0]; //將堆頂和堆中最后一個(gè)記錄交換 Heapify(R,1,i-1); //將R[1..i-1]重新調(diào)整為堆,僅有R[1]可能違反堆性質(zhì) } } ---------------------------------------Code--------------------------------------
堆排序的時(shí)間,主要由建立初始堆和反復(fù)重建堆這兩部分的時(shí)間開銷構(gòu)成,它們均是通過調(diào)用Heapify實(shí)現(xiàn)的。
堆排序的最壞時(shí)間復(fù)雜度為O(nlgn)。堆排序的平均性能較接近于最壞性能。 由于建初始堆所需的比較次數(shù)較多,所以堆排序不適宜于記錄數(shù)較少的文件。 堆排序是就地排序,輔助空間為O(1), 它是不穩(wěn)定的排序方法。
堆排序與直接插入排序的區(qū)別:
直接選擇排序中,為了從R[1..n]中選出關(guān)鍵字最小的記錄,必須進(jìn)行n-1次比較,然后在R[2..n]中選出關(guān)鍵字最小的記錄,又需要做n-2次比較。事實(shí)上,后面的n-2次比較中,有許多比較可能在前面的n-1次比較中已經(jīng)做過,但由于前一趟排序時(shí)未保留這些比較結(jié)果,所以后一趟排序時(shí)又重復(fù)執(zhí)行了這些比較操作。
堆排序可通過樹形結(jié)構(gòu)保存部分比較結(jié)果,可減少比較次數(shù)。
八、拓?fù)渑判?/p>
例 :學(xué)生選修課排課先后順序
拓?fù)渑判颍喊延邢驁D中各頂點(diǎn)按照它們相互之間的優(yōu)先關(guān)系排列成一個(gè)線性序列的過程。
方法:
在有向圖中選一個(gè)沒有前驅(qū)的頂點(diǎn)且輸出
從圖中刪除該頂點(diǎn)和所有以它為尾的弧
重復(fù)上述兩步,直至全部頂點(diǎn)均已輸出(拓?fù)渑判虺晒Γ蛘弋?dāng)圖中不存在無(wú)前驅(qū)的頂點(diǎn)(圖中有回路)為止。
---------------------------------------Code--------------------------------------
void TopologicalSort()/*輸出拓?fù)渑判蚝瘮?shù)。若G無(wú)回路,則輸出G的頂點(diǎn)的一個(gè)拓?fù)湫蛄胁⒎祷豋K,否則返回ERROR*/
{
int indegree[M];
int i,k,j;
char n;
int count=0;
Stack thestack;
FindInDegree(G,indegree);//對(duì)各頂點(diǎn)求入度indegree[0....num]
InitStack(thestack);//初始化棧
for(i=0;iG.num;i++)
Console.WriteLine("結(jié)點(diǎn)"+G.vertices[i].data+"的入度為"+indegree[i]);
for(i=0;iG.num;i++)
{
if(indegree[i]==0)
Push(thestack.vertices[i]);
}
Console.Write("拓?fù)渑判蜉敵鲰樞驗(yàn)椋?);
while(thestack.Peek()!=null)
{
Pop(thestack.Peek());
j=locatevex(G,n);
if (j==-2)
{
Console.WriteLine("發(fā)生錯(cuò)誤,程序結(jié)束。");
exit();
}
Console.Write(G.vertices[j].data);
count++;
for(p=G.vertices[j].firstarc;p!=NULL;p=p.nextarc)
{
k=p.adjvex;
if (!(--indegree[k]))
Push(G.vertices[k]);
}
}
if (countG.num)
Cosole.WriteLine("該圖有環(huán),出現(xiàn)錯(cuò)誤,無(wú)法排序。");
else
Console.WriteLine("排序成功。");
}
----------------------------------------Code--------------------------------------
算法的時(shí)間復(fù)雜度O(n+e)。
文章題目:拓?fù)渑判蛩惴╦ava代碼 拓?fù)渑判蛩惴▊未a
當(dāng)前路徑:http://www.chinadenli.net/article40/dooigho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、手機(jī)網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化、定制開發(fā)、App設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)