很裸的乙個題吧,就是先求出乙個最小生成樹,然後求的同時把圖給建好,然後列舉起點,求最短路。因為在樹上求最短路必然是o(n)的,所以總的複雜度是o(n2)的
求最短路的時候囧了,直接寫的spfa,其實直接bfs就行了。不過明顯寫spfa寫習慣了。
當然這道題卡人的地方很猥瑣,是精度。
用double竟然精度都不夠,很詫異啊,然後經指點才知道,題目說最多有兩位小數,直接放大100倍成long long型別的就行了,而且不能用double直接乘100,會掛,可以用字串讀入,然後處理,或者加個eps,然後輸出的時候也沒什麼要求,其實就三種情況,整數,1個小數,二個小數。判斷一下就行了。
/*
id: sdj22251
prog: inflate
lang: c++
*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define maxn 1105
#define inf 10000000000000000ll
#define l(x) x<<1
#define r(x) x<<1|1
#define pi acos(-1.0)
#define eps 1e-7
using namespace std;
long long dis[maxn][maxn];
long long lowcost[maxn], d[maxn];
int nearvex[maxn], head[maxn], vis[maxn], q[maxn * maxn];
int n, m, e;
struct node
edge[2 * maxn * maxn];
void insert(int x, int y, long long w)
void spfa(int src)}}
}}void out(long long x)
void prim(int u)
nearvex[u] = -1;
for(int i = 1; i < n; i++)
}if(v != -1)}}
}out(sumweight);
}long long in(char *s)
}int cnt = len - 1 - id;
for(int i = 0; i < 2 - cnt; i++)
s[len++] = '0';
long long sum = 0;
for(int i = 0; i < len; i++)
return sum;
}int main()
prim(1);
long long mi = inf;
int pos = 1;
for(int i = 1; i <= n; i++)
if(sum < mi)
}mi *= 2;
cout << pos << " ";
out(mi);
printf("\n");
//printf("%d %f\n\n", pos, mi * 2);}}
return 0;
}
最短路徑 最小生成樹
題目描述 n個城市,標號從0到n 1,m條道路,第k條道路 k從0開始 的長度為2 k,求編號為0的城市到其他城市的最短距離 輸入描述 第一行兩個正整數n 2 n 100 m m 500 表示有n個城市,m條道路 接下來m行兩個整數,表示相連的兩個城市的編號 輸出描述 n 1行,表示0號城市到其他城...
最短路徑 最小生成樹
今天覆習的時候,剛好複習的這一塊,所以就簡單做乙個備忘,寫的潦草還望大家不要介意呀 1 dijistra演算法 思路 根據點集合將其分為兩個集合,一種是已經訪問過的點s集合 代表從源點到該集合中的點的距離最小 另一種是未訪問過的u集合,然後每次從u集合中選擇節點,使得源點到改點的距離最小,並新增進s...
7 11最小生成樹 最短路
其實這一部分的知識在前面我也算是學了一些了,今天老師講的是一些應用部分,結果我發現自己一臉懵逼,有些題我甚至連這是最短路都沒有看出來。看來還並沒有修煉到一定的水準,並且我還是發現一些自己還沒有學習過的知識,下面我們就先從鏈式前向星開始說起。首先我們就來介紹一下這個東西是個什麼。圖的儲存一般有兩種 鄰...