/********
用向量存2的幂所构成的多项式的位权,在多项式运算时用到操作符的重载
********/
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 105;
typedef long long LL;
int n, m;
int g[N][N];
vector<int> dis[N];
bool vis[N];
void dijkstra();
vector<int> operator + (vector<int> v, int data);
bool operator < (vector<int> v1, vector<int>v2);
LL exp(LL a, LL b, LL m);
int main()
{
#ifndef ONLINE_JUDGE
freopen("d:\\OJ\\uva_in.txt", "r", stdin);
#endif // ONLINE_JUDGE
while (scanf("%d%d", &n, &m) == 2) {
memset(g, -1, sizeof(g));
for (int i = 0; i < m; i++) {
int a, b;
scanf("%d%d", &a, &b);
g[a][b] = g[b][a] = i;
}
dijkstra();
}
return 0;
}
vector<int> operator + (vector<int> v, int data)
{
vector<int> ans;
sort(v.begin(), v.end());
for (int i = 0; i < v.size(); i++) {
if (v[i] == data) {
v[i]++;
ans = v;
return ans;
}
}
ans = v;
ans.push_back(data);
return ans;
}
bool operator < (vector<int> v1, vector<int>v2)
{
sort(v1.begin(), v1.end());
sort(v2.begin(), v2.end());
vector<int>::iterator it1 = v1.end(), it2 = v2.end();
it1--, it2--;
while (it1 != v1.begin() && it2 != v2.begin()) {
if (*it1 < *it2) return true;
else if (*it1 > *it2) return false;
else {
it1--, it2--;
}
}
if (*it1 == *it2) {
return v1.size() < v2.size();
}
return *it1 < *it2;
}
void dijkstra()
{
memset(vis, false, sizeof(vis));
for (int i = 0; i < n; i++) {
dis[i].clear();
dis[i].push_back(1000);
}
for (int i = 0; i < n; i++) {
if (g[0][i] != -1) {
dis[i].clear();
dis[i].push_back(g[0][i]);
}
}
vis[0] = true;
int u = 0;
for (int i = 1; i < n; i++) {
vector<int> Min;
Min.push_back(1000);
for (int j = 0; j < n; j++) {
if (!vis[j] && dis[j] < Min) {
Min = dis[j];
u = j;
}
}
vis[u] = 1;
for (int j = 0; j < n; j++) {
if (!vis[j] && g[u][j] != -1 && dis[u] + g[u][j] < dis[j]) {
dis[j] = dis[u] + g[u][j];
}
}
}
for (int i = 1; i < n; i++) {
if (dis[i].size() == 1 && dis[i][0] == 1000) {
printf("-1\n");
continue;
}
LL len = 0;
for (int j = 0; j < dis[i].size(); j++) {
len += exp(2, dis[i][j], 100000);
len %= 100000;
}
printf("%lld\n", len);
}
}
LL exp(LL a, LL b, LL m)
{
LL product = 1;
while (b) {
if (b & 1) product = product * a % m;
a = a * a % m;
b >>= 1;
}
return product;
}
题目1100:最短路径
最新推荐文章于 2022-08-28 21:07:42 发布
413

被折叠的 条评论
为什么被折叠?



