1. 程式人生 > >[轉載]圖論一筆畫問題代碼基本框架

[轉載]圖論一筆畫問題代碼基本框架

algorithm 統計 尋找 max end ret return include sin

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define maxn 10001
int map[maxn][maxn];//讀入 
int du[maxn];//記錄每個點的度,就是相連的邊的數目
int Euler[maxn];//用來記錄找到的歐拉路的路徑
int n,m,x,y,start,lll;//lll的意思是——我也不知道-_-!; 

void find(int i)//從開始的頂點深度優先遍歷過程尋找歐拉路
{
	for(int j=1;j<=n;j++)
	if(map[i][j]==1)          //從任意一個與它相連的點出發 
	{
		map[j][i]=map[i][j]=0;
		find(j);
	}
	Euler[++lll]=i;//記錄下路徑
}
int main()
{
	ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>x>>y;
        map[y][x]=map[x][y]=1;
        du[x]++;      //統計每個點的入度
        du[y]++;     //統計每個點的出度 
    }
    start=1;      //如果有奇點,就從奇點開始尋找,這樣找到的就是歐拉路 
    for(int i=1;i<=n;i++)        //歐拉回路。沒有奇點就從任意點開始,
       if(du[i]%2==1)  //這樣因為每一個點都是偶點,找到的就是歐拉回路。
           start=i;
    lll=0;
    find(start);
    for(int i=1;i<=lll;i++)
        cout<<Euler[i]<<‘ ‘;
    cout<<endl;
	return 0;
}

  原文見快樂永恒的博客,看我友鏈~

[轉載]圖論一筆畫問題代碼基本框架