description
v11開了一家旅行社,眾所周知現在商業競爭越來越激烈,為了更好地吸引消費者的眼球,v11決定制定到一條最短的旅遊路線,路線的開始點和結束點必須是同乙個地方。你的任務就是編寫程式幫助v11尋找到這樣的路線。
現在給出旅行路線圖,圖中有n個景點編號從1到n,有m條雙向邊編號從1到m。每條邊包含三個數字a,b,c。表示這條路線連線景點a和景點b,他們之間的距離是c。為了簡化問題,我們認為:每條旅遊路線是乙個至少包含三個點的簡單迴路。每條旅遊路線的長度為它包含的所有邊的距離之和。
現在的任務是:要求你編寫程式尋找這樣的最短路,給出它的路程長度,並輸出同時存在有幾個這樣的最短路。
注意的是:
1.當兩條最短路程中所經過的景點(不考慮順序),完全相同時,才是相同的最短路程。否則,算作不同的最短路程。
2. 圖的頂點序列中,除了第乙個頂點和最後乙個頂點外,其餘頂點不重複出現的迴路叫簡單迴路。(本題中將第乙個頂點和最後乙個頂點當作同乙個景點)
3.本題中不存在自環。
input
輸入資料第一行包含乙個整數t,表示測試資料的組數。對於每組測試資料:
第一行為兩個整數n,m(1output
對於每組測試資料:如果存在這樣的最短路線,輸出它的長度和不同的最短路線的個數。如果不存在則輸出-1。兩個數字之間用空格隔開,每組測試資料一行。
sample input
13 31 2 1
3 1 1
3 2 1
sample output
3 1
hint
樣例一中,我們可以從景點1出發的路線:1->2->3->1;
可以從景點2出發的路線:2->3->1->2;
同樣也可以從景點3出發的路線:3->1->2->3;
我們認為這3條路線所經過的景點集合為所以他們是相同的路線。
**:
#include#include#define m 107
#define inf 0x3f3f3f
using namespace std;
int g[m][m],dis[m][m],path[m][m],pre[m];
int n,m,num,mincircle,count;
void init()
g[i][i]=dis[i][i]=0;
}}void dfs(int i,int j)
dfs(i,k);
dfs(k,j);
}void floyd()
else if(mincircle==dis[i][j]+g[i][k]+g[k][j])//記錄次數
count++;
}for(int i=1; i<=n; i++)//求最短路
for(int j=1; j<=n; j++)
if(dis[i][k]+dis[k][j]c)
}memset(path,0,sizeof(path));
floyd();
if(mincircle==inf)
printf("-1\n");
else
printf("%d %d\n",mincircle,count);
}return 0;
}
極地旅行社 LCT
不久之前,mirko建立了乙個旅行社,名叫 極地之夢 這家旅行社在北極附近購買了n座冰島,並且提供觀光服務。當地最受歡迎的當然是帝企鵝了,這些小傢伙經常成群結隊的遊走在各個冰島之間。mirko的旅行社遭受一次重大打擊,以至於觀光遊輪已經不划算了。旅行社將在冰島之間建造大橋,並用觀光巴士來運載遊客。m...
BZOJ2843 極地旅行社
題意 連邊,詢問權值和,單點修改權值 裸的不能再裸的lct模板題。話說我就貼了個剛寫完的板,改了下輸入,輸出,資料範圍都沒看,居然就a了。一點坑點都沒有,要不要這樣啊。include include include define n 200005 using namespace std int n,...
bzoj2843 極地旅行社
description 不久之前,mirko建立了乙個旅行社,名叫 極地之夢 這家旅行社在北極附近購買了n座冰島,並且提供觀光服務。當地最受歡迎的當然是帝企鵝了,這些小傢伙經常成群結隊的遊走在各個冰島之間。mirko的旅行社遭受一次重大打擊,以至於觀光遊輪已經不划算了。旅行社將在冰島之間建造大橋,並...